Используя System.Net.Socket, как мы можем узнать, когда удаленный сокет закрыт? - PullRequest
2 голосов
/ 27 мая 2009

Хорошо, вот как идут дела:

[Server] Start
[Server] Socket.AcceptConnection
[Client] Start
[Client] Socket.Connect 
[Server] Receive //blocking
[Client] Send
[Server] Print
[Server] Receive
[Client] Close socket

Есть ли способ узнать, когда клиент закрыл соединение? В настоящее время я использую трюк с поддельными пакетами, как описано в MSDN, где в отдельном потоке я делаю

[Server] socket.Send(byte[], 0,0);

И я проверяю, выдает ли она какую-либо ошибку, но это не так, даже если клиент закрыл сокет.

P.S. Я действительно думаю, может ли это быть проблемой, если у меня есть сокет на стороне сервера (TCP) и TcpClient на стороне клиента?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 27 мая 2009

Согласно документации для Socket.Connected :

Значение свойства Connected отражает состояние соединения по состоянию на самую последнюю операцию. Если вам нужно определить текущий состояние соединения, сделать Неблокируемый, нулевой байт Отправить звонок. Если звонок успешно завершен или выдает код ошибки WAEWOULDBLOCK (10035), то розетка еще связано; в противном случае сокета нет больше подключен.

Обратите внимание, что ваш текущий вызов является блокирующим, насколько я вижу, - вам необходимо сделать неблокирующий вызов в соответствии с этой документацией.

1 голос
/ 27 мая 2009

TCP-соединение должно возвращать 0, т. Е. EOF, при чтении из сокета, на котором был получен FIN, но вам будет гораздо лучше разработать свой протокол, чтобы стороны сообщали друг другу, когда пришло время отключить закройте розетку. Также игра с одним и тем же сокетом из нескольких потоков укусит вас - избегайте этого.

0 голосов
/ 23 декабря 2013
bool part1 = s.Poll(1000, SelectMode.SelectRead);
bool part2 = (s.Available == 0);
if (part1 & part2)
{//connection is closed
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...