Здравствуйте, vsb, Вы писали:
vsb>Имеется клиент с протоколом UDP. Изменить это нельзя. От него приходят пакеты с определённой информацией. Клиент это девайс, к компьютеру с Windows подключен напрямую патч-кордом. В целом всё работает, но иногда бывают непонятные проблемы. Пакеты приходят маленькие. В ОС с ними работает обычная программа из юзерспейса. К сожалению в протоколе нет номеров пакетов или ещё какой-либо информации.
UDP не обрезает пакетов сам. Если пакеты перестают помещаться в буфер сокета, то пакет будет отброшен, а не обрезан.
Единственное место, где пакет может быть обрезан, это когда вызову
recv() передают слишком маленький буфер для результата.
vsb>Правильно ли я понимаю, что размер UDP буфера в Windows 32 KB (для каждого сокета)? От клиента данные приходят со скоростью примерно 1.6 KB/s (20 пакетов в секунду). То бишь буфера хватает на 20 секунд. Программа работает постоянно, задержек больше, чем на сотые доли секунды не бывает, значит с размером буфера проблем быть не может.
Он управляется параметром
SO_RCVBUF. Чего там по умолчанию, я уже забыл, но имеет смысл явно ставить, во избежании сюрпризов.
https://learn.microsoft.com/ru-ru/windows-hardware/drivers/network/so-rcvbuf (аж даже по-русски, до чего дошел прогресс...)
vsb>Можно ли быть уверенными, что сетевые драйверы в Windows гарантируют упорядоченность пакетов после того, как они их приняли, если в буфере место не кончилось?
vsb>Можно ли быть уверенными, что если патч-корд хороший, то потерь и переупорядочиваний пакетов на таких скоростях быть не может?
Ну, гарантий нет, и они имеют полное право реордерить пакеты. Я правда не могу сообразить, зачем бы им могло захотеться этим правом воспользоваться...