2009-11-25 3 views
2

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

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

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

+0

Какая ОС вы используете? – abyx

+0

не могли бы вы разместить свой код !!!! – 2011-01-27 12:22:39

ответ

2

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

1

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

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