TcpListener Socket все еще активен после выхода программы

Я пытаюсь остановить прослушиватель TCP, когда моя программа выходит. Мне не нужны какие-либо данные, которые в настоящее время активны в сокете или любом из активных клиентских сокетов.

Код очистки сокета по существу:

try
{
    myServer.Server.Shutdown(SocketShutdown.Both)
}
catch (Exception ex)
{
     LogException(ex)
}
myServer.Server.Close(0)
myServer.Stop()

myServer - это TCPListener

В некоторых случаях Shutdown выдает исключение

System.Net.Sockets.SocketException: Запрос на отправку или получение данных был запрещен, поскольку сокет не подключен и (при отправке по сокету дейтаграммы с помощью вызова sendto) адрес не был отправлен  в System.Net.Sockets.Socket.Shutdown(SocketShutdown как)

Изменить 2010-май-14

При дальнейшем исследовании исключение может быть выбрано, и сокет может быть правильно закрыт.

Иногда даже после выхода приложения netstat показывает, что сокет все еще находится в состоянии LISTENING.

Мне не удалось создать окончательный сценарий воспроизведения, это происходит в казалось бы случайное время.

Клиентские сокеты очищаются независимо.

Есть ли у вас какие-либо предложения, чтобы помочь мне согнуть этот сокет?

Ответ 1

Используйте блок finally для вызова Close() в случае исключения:

try
{
    myServer.Server.Shutdown(SocketShutdown.Both);
}
catch (Exception ex)
{
    LogException(ex);
}
finally
{
    myServer.Server.Close(0);
    myServer.Stop();
}

Мне также интересно, требуется ли манипуляция базовым сокетом из-за некоторой спецификации, о которой вы не упомянули? TCPListener/Client разработаны в большинстве случаев, чтобы вы не беспокоились об этой коммуникационной механике.

Кроме того, если это не помогает, то какой ErrorCode возвращается SocketException?

Ответ 2

Попробуйте вызвать Stop before Close...

Ответ 3

После выхода вашего приложения сокет не может находиться в состоянии прослушивания. Однако он может находиться в состоянии ожидания; это совершенно нормально.

Ответ 4

имела аналогичную проблему: - TcpListener ожидает подключения клиентов - Утилизировать при закрытии

имела ту же проблему (win7, win2k).

Решение, которое работает (до сих пор) для меня, заключалось в том, чтобы закрыть каждое из соединений с клиентом при утилизации слушателя. Похоже, что если программа существует, пока есть все еще активные соединения VS клиента, это соединение может оставаться после завершения программы.