C # Socket.Connected свойство изменяется на false после вызова Socket.Receive - PullRequest
4 голосов
/ 18 июня 2009
int readCount;
byte[] buffer = new byte[128];
SocketError socketError;

TcpClient tcpClient = tcpListener.AcceptTcpClient();
tcpClient.Client.ReceiveTimeout = 500; // #1
// tcpClient.Client.Connected is **true** here.
readCount = tcpClient.Client.Receive(buffer, 0, buffer.Length, SocketFlags.None, out socketError); // reacCount > 0
// tcpClient.Client.Connected is **false** here.

Если # 1 заменено на tcpClient.Client.Blocking = false; , tcpClient.Client.Connected имеет правильное значение (true).

<ч />

Я установил для свойства Socket.ReceiveTime значение 100 и вызвал Socket.Receive(). Receive() вернул целочисленное значение больше нуля. Никаких исключений не произошло. После того, как я выполнил свою работу с скопированным буфером - я не использовал ни один из методов, связанных с Socket, - свойство Socket.Connected было изменено на false. Почему?

Ответы [ 2 ]

5 голосов
/ 18 июня 2009

Ключ может быть в том, что TcpClient.Connected действительно делает:

Свойство Connected получает состояние подключения клиентского сокета с последней операции ввода / вывода . Когда это возвращает false, клиентский сокет был либо никогда не подключен, либо нет больше подключен.

Потому что только свойство Connected отражает состояние соединения с самой последней операции вы должен попытаться отправить или получить сообщение для определения текущего государство. После неудачной отправки сообщения это свойство больше не возвращает true. Обратите внимание, что это поведение предусмотрено дизайном. Вы не можете надежно проверить состояние связь, потому что во времени между тестом и отправкой / получением, связь могла быть потеряна. Ваш код должен предполагать, что сокет подключен, и изящно обрабатывать сбой передачи.

Так что, когда вы не блокируете и к тому времени, когда вы проверяете значение «Подключено», возможно, что чтение не было завершено, поэтому «Подключено» все еще имеет старое значение.

0 голосов
/ 18 июня 2009

Это может произойти, если удаленный хост больше не подключен к сокету. Есть ли время ожидания на другой стороне соединения, которое могло быть превышено?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...