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