Может ли Socket.Receive () вернуть 0, если соединение все еще открыто? - PullRequest
5 голосов
/ 14 января 2011

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

Я установил тайм-аут приема на заданное значение, и я ожидал, что Socket.Receive () сгенерирует исключение после этого количества времени. Но вместо этого метод просто возвращает 0.

Итак, мой вопрос: возможно ли, что сокет все еще открыт, если Socket.Receive() возвращает 0? Или я могу с уверенностью предположить, что он не работает?

(Может быть немного сложно понять. Если так, пожалуйста, дайте мне знать в комментариях)

Ответы [ 2 ]

13 голосов
/ 14 января 2011

Неа. Это не работает, если вы получаете 0.

Из MSDN:

Если удаленный хост завершает соединение Socket методом Shutdown и все доступные данные были получены, метод Receive завершится немедленно и вернет ноль байтов.

http://msdn.microsoft.com/en-us/library/8s4y8aff.aspx

1 голос
/ 14 января 2011

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

Он также вернет ноль, если локальное приложение отключило сокет для ввода.

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