Когда EndReceive возвращает ноль байтов - PullRequest
0 голосов
/ 19 октября 2010

Я пытаюсь лучше разобраться с асинхронным использованием сокетов.Согласно этой статье, http://msdn.microsoft.com/en-us/library/bew39x2a(v=VS.85).aspx, Я должен иметь возможность проверить количество байтов, возвращаемых EndReceive, и если оно равно нулю, я знаю, что у меня есть все данные, и если оно не равно нулю, то может или может бытьне будет больше данных.Это имеет смысл, но когда я вызываю BeginReceive в последний раз, часто вызывается функция обратного вызова за несколько минут ... Я предполагаю, что что-то должно истечь, но изменение свойства Socket.ReceiveTimeout, похоже, не дает эффекта.

Действительно ли это правильный шаблон для определения того, когда я получил все данные?Особенно, когда я не знаю формат получаемого сообщения?

Ответы [ 2 ]

3 голосов
/ 19 октября 2010

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

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

0 голосов
/ 19 октября 2010

Поскольку TCP является потоково-ориентированным протоколом, существует 3 основных способа узнать, когда сообщение было полностью получено:

  1. длина сообщения известна (либо потому, что это фиксированная длина, либо потому, что что-тов протоколе указывается, сколько это времени)
  2. в конце сообщения есть разделитель, который можно проверить на
  3. соединение закрыто
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...