Вы правы, что один вызов recvfrom () вернет не более одну UDP-дейтаграмму.Но нет никакой гарантии, что каждая дейтаграмма действительно прибудет.
В частности, если отправляемая вами дейтаграмма UDP слишком велика, она может разбиться на части на уровне сети (фрагментация), что увеличивает вероятность того, чтодатаграмма будет отброшена (поскольку потеря любого фрагмента приводит к потере целого).Вы не видите фрагментации на уровне приложения, потому что сетевой уровень повторно собирает пакет для вас.
Все может стать очень сложным, потому что невозможно заранее точно определить, насколько большой размер слишком велик.Существуют различные алгоритмы обнаружения, но все они равны пробам и ошибкам.Хуже того, брандмауэры, маршрутизаторы и операционные системы могут (и часто делают) со временем менять свое поведение на фрагментированные дейтаграммы.Могут быть сценарии, когда пакет определенного размера или состава всегда будет отброшен, потому что он нарушает какое-то правило брандмауэра.
Поэтому никогда не предполагайте, что sendto () обязательно приведет к recvfrom (), и попытайтесьоставляйте ваши дейтаграммы маленькими (менее 1400 байт достаточно безопасно, менее 512 байт очень безопасно).