Поведение блокировки сокета C # - PullRequest
1 голос
/ 07 мая 2010

Моя ситуация такова: у меня есть сокет C # tcp, через который я получаю структурированные сообщения, состоящие из 3-байтового заголовка и полезной нагрузки переменного размера. Данные tcp маршрутизируются через сеть туннелей и иногда подвержены фрагментации. Решением этого является выполнение блокирующего чтения 3 байтов для заголовка и блокирующего чтения N байтов для полезной нагрузки переменного размера (значение N находится в заголовке). Проблема, с которой я сталкиваюсь, заключается в том, что иногда блокирующая операция получения возвращает частичный пакет. То есть он считывает объем байтов меньше, чем число, которое я явно установил в вызове приема. После некоторой отладки выясняется, что количество возвращаемых байтов равно количеству байтов в свойстве Available сокета перед операцией receive.

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

1 Ответ

2 голосов
/ 07 мая 2010

Поведение зависит от типа используемого сокета.TCP - это сокет, ориентированный на соединение, что означает :

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

При использовании TCP-сокетов вы должны быть готовы к этой возможности;проверьте возвращаемое значение метода Receive и, если оно оказалось меньше ожидаемого, снова введите Receive, пока либо сокет не будет закрыт, либо вы фактически получите столько данных, сколько вам нужно.

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