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

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

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

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


person avd    schedule 25.11.2009    source источник
comment
не могли бы вы разместить свой код !!!!   -  person    schedule 27.01.2011


Ответы (2)


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

person abyx    schedule 25.11.2009

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

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

person Steve-o    schedule 18.08.2010