Возможно ли, что чтение этого буфера приведет к удалению входящих пакетов?
Пакеты могут быть сброшены, если они приходят быстрее, чем вы их читаете.
Если это так, какие варианты исправить это?
Один из вариантов - изменить сетевой протокол: использовать TCP или реализовать некоторое подтверждение + «управление потоком» с использованием UDP.
В противном случае вам нужно понять, почему вы не читаете достаточно быстро / часто.
Если ЦП загружен на 100%, вам нужно выполнять меньше работы с пакетом или получать более быстрый ЦП (или использовать многопоточность и большее количество ЦП, если вы этого еще не сделали).
Если процессор не на 100%, то, возможно, происходит следующее:
- Вы читаете пакет
- Вы выполняете некоторую работу, которая занимает x мсек реального времени, часть из которых затрачивается на другие операции ввода-вывода (поэтому процессор не занят, но не используется для чтения другого пакета)
- В течение этих x msec приходит поток пакетов, а некоторые отбрасываются
Лекарством от этого может быть изменение резьбы.
Другая возможность состоит в том, чтобы сделать несколько одновременных чтений из сокета (каждое из ваших чтений предоставляет буфер, в который может быть принят пакет UDP).
Другая возможность состоит в том, чтобы увидеть, есть ли (O / S-специфичная) опция конфигурации для увеличения количества принятых пакетов UDP, которые сетевой стек готов буферизировать, пока вы не попытаетесь их прочитать.