Цитата(Vacik @ Jan 14 2017, 16:19)

Есть ли способ улучшить прием?
Попробуйте использовать WSASocket и все что с ним связано - это если делать под Windows. Суть в том, что можно организовать прием пачки пакетов как-бы "автоматически", т.е. без "дергания" механизмов синхронизации уровня пользователя. Ну и естественно, организуете свою буферизацию как бы вторым слоем.
У нас стояла задача выжать предельную производительность при приеме 1Г потока с нашего железа на комп под виндой. Сначала я написал пробной тест с использованием обычных сокетов, но были проблемы с потерей пакетов, переупорядочиванием (даже на локал-хосте!) и, самое главное, загрузкой процессора. У нас пакеты не превышали обычную длину, т.е. 1472 байта. Был организован пул буферов (количество буферов естественно настраивается, но из практики их количество = 64-256). На каждый принятый пакет формируется сообщение (вроде бы там семафор используется, но это уже детали реализации) и управление передается следующему слою софта (следующему потоку).
С WSA сокетами получается двухуровневая буферизация - на уровне WSA организуется пул "мега"-буферов каждый на 64 пакета (это вроде максимум, что WSA может позволить) и ОС дергается уже в 64 раза реже, чем при использовании обычных сокетов. Ну а далее все тоже самое - организуется еще один слой - ряд буферов, как и в первом случае, но теперь это уже буфера 64*1472 (все параметры есс-но задаются как минимум на уровне компайл-тайм), их количество у нас порядка 128.
Скорость в установившемся режиме (гоняли сутками) удалось получить на уровне 99.7% или 99.8% от теоретического предела для 1Г. Стабильность высокая. Загрузка процессора небольшая. При грамотно написанном софте можно распараллелить задачу - как минимум аффиннити процессорам задать, но нам и этого не потребовалось.
100% исключить пропадания пакетов нельзя, да и сам UDP это не гарантирует.
P.S. А вообще, мне тоже многие знакомы профи сказали "переходи на Линукс"