Использование recvfrom() с необработанными сокетами: общее сомнение

Я создал необработанный сокет, который принимает все пакеты IPv4 с канального уровня (без заголовка канального уровня). И для чтения пакетов я использую recvfrom,

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

Так как предотвратить эту вещь? Должен ли я читать побайтово и анализировать каждый байт, но это очень неэффективно.

2 ответа

Решение

IIRC, recvfrom() будет возвращать только один пакет за раз, даже если в очереди будет больше.

Необработанные сокеты работают на уровне пакетов, концепция потоков данных отсутствует.

Вы можете быть заинтересованы в recvmmsg() если вы хотите прочитать несколько пакетов за один системный вызов. Только для последних версий Linux, эквивалентной реализации на стороне отправки не существует.

Другие вопросы по тегам