Я создал необработанный сокет, который принимает все пакеты IPv4 с уровня канала данных (с удаленным заголовком уровня канала данных). А для чтения пакетов использую recvfrom
.
Я сомневаюсь: предположим, что из-за некоторого планирования, выполненного ОС, мой процесс спал на 1 секунду. Когда он проснулся, он сделал recvfrom
(с количеством байтов, которые должны быть получены, скажем, 1000) на этом необработанном сокете (с намерением получить только один пакет IPv4 и сказать, что размер этого пакета составляет 380 байтов. ). И предположим, что многие сетевые приложения также работали одновременно в это время, поэтому все пакеты IPv4 должны быть поставлены в очередь в приемном буфере этого сокета. Итак, теперь recvfrom
вернет все 1000 байтов (с другими пакетами IPv4, начиная с 381-го байта), bcoz в его буфере достаточно данных для возврата. Хотя моя программа была предназначена для понимания только одного пакета IPv4
Итак, как предотвратить это? Должен ли я читать побайтово и разбирать каждый байт, но это очень неэффективно.