Спасибо за ваш вклад. Однако мы смогли «решить» эту проблему.
Ранее я описал, как мы читаем сообщения.
После того, как select возвращает, мы запускаем цикл (на количество прочитанных необработанных сообщений, которое в нашем случае было> 1).
1) мы вызываем ioctl (FIONREAD), чтобы найти количество байтов для чтения;
2) прочитать столько байтов, вызвав recvfrom
3) отправить байты пользователю
4) снова войдите в цикл и вызовите ioctl (FIONREAD), а затем повторите шаги
Однако в пункте 4 ioctl (FIONREAD) использует для возврата 0. Наш код прошел защитную проверку. Ожидалось, что 0 байтов от ioctl (FIONREAD) означают, что отправитель отправил заголовок IP с 0 полезными данными. Поэтому он используется для вызова recvfrom (байты для чтения = 0), чтобы очистить заголовок IP, чтобы выбор не установился снова.
В момент времени t0 ioctl (FIONREAD) возвращает 0 как число байтов для чтения.
В момент времени t1 вызывается recvfrom (байты до чтения = 0).
Иногда, между t0 и t1, фактические данные используются для постановки в очередь в очереди приема сокета и используются для отбрасывания при вызове recvFrom (bytes = 0).
Установка, число rawMsgsToRead = 1 "решило" эту проблему. Тем не менее, я думаю, это повлияет на нашу производительность. Это любой вызов ioctl, который может различать октеты в очереди как 0 и заголовок IP с полезной нагрузкой 0