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