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 клиента, это соединение может оставаться после завершения программы.