2015-04-26 5 views
3

Я пишу сниффер, используя libpcap. Моя проблема в том, что существует 7-10-секундная задержка между вызовом pcap_loop() или pcap_next() и фактическим получением пакета (вызывающая функция вызова). Однако, если я использую wirehark с тем же фильтром на одном и том же устройстве, такой задержки не возникает после нажатия кнопки «Пуск». Почему в моей программе есть задержка, и есть ли способ исправить это?Почему существует длительная задержка между pcap_loop() и получением пакета?

Я работаю над чипами atheros wifi. Устройство находится в режиме мониторинга с использованием

airmon-ng start wlan0 

Я уверен, что вы много трафика, чтобы слушать, потому что я могу увидеть пакеты в Wireshark. Спасибо.

+0

Какое значение вы передаете в качестве аргумента * to_ms * для 'pcap_open_live()' или 'pcap_set_timeout()' в вашей программе? –

+0

Спасибо за внимание. Я использую 10000. Кроме того, я использую Debian linux. Я прочитал учебник об этом поле: «по крайней мере на некоторых платформах это означает, что вы можете дождаться появления достаточного количества пакетов до просмотра каких-либо пакетов, поэтому вы должны использовать ненулевой тайм-аут». Но я не уверен, что понимаю , Является ли linux среди этих платформ? –

ответ

3

Я использую 10000

to_ms аргумент pcap_open_live() и pcap_set_timeout() в миллисекундах.

10000 миллисекунд - 10 секунд.

Попробуйте использовать 1000, что означает использование tcpdump - это уменьшит задержку до 1 секунды - или использует 100, что является значением, используемым Wireshark, что уменьшит задержку до 1/10 секунды.

Я прочитал на учебник по этой области: «по крайней мере, в некоторых платформах, это означает, что вы можете ждать, пока достаточное количество пакетов, не дойдет до просмотра всех пакетов, так что вы должны использовать ненулевую тайм-аут»

в учебнике речь идет the tcpdump.org "How to use libpcap" tutorial, и проход в вопросе был добавлен в этом CVS совершать:

revision 1.8 
date: 2005/08/27 23:58:39; author: guy; state: Exp; lines: +34 -31 
Use a non-zero timeout in pcap_open_live(), so you don't wait for a 
bufferful of packets before any are processed. 

Correctly explain the difference between pcap_loop() and 
pcap_dispatch(). 

In sniffex.c, don't print the payload if there isn't any. 

, так что я знаком с ним. :-)

Мне нужно было потратить некоторое время на просмотр кода ядра Linux (снова), чтобы узнать, какое влияние имеет значение тайм-аута 0 на более новые ядра. Однако при написании кода, который использует libpcap/WinPcap для записи в реальном времени, вы должны всегда действовать так, как будто вы пишете код для такой платформы; ваш код будет более переносимым для других платформ. и не сломаются, если изменится поведение нулевого таймаута.

+0

Я изменил таймаут до 100, и теперь задержка исчезла, большое вам спасибо! Я все еще немного смущен. Что означает эта задержка? Когда приходит пакет, не вызвана ли функция обратного вызова? Или пакеты буферизованы для времени «to_ms», а затем разобрались? Какая польза от этой задержки? Еще раз спасибо! –

+0

Еще одна вещь ~ Я пытаюсь захватить в wirehark и в своих программных маяках из моей собственной AP. Но нет. или очень мало (менее 10 за одну минуту). Однако, если я использую airodump-ng, на моей станции есть гораздо больше маяков. Означает ли это, что пакеты упали, скажем, на ядро ​​/ драйвер? Но wirehark говорит Dropped: 0. –

+1

«Когда приходит пакет, не вызвана ли функция обратного вызова?» Нет. Когда приходит пакет, с некоторыми механизмами захвата пакетов (BPF для всех, кроме AIX, DLPI в Solaris, TPACKET_V3 в Linux, WinPcap в Windows), он помещается в буфер. Последующие пакеты помещаются после него в буфер; буфер передается пользователю либо при заполнении, либо по истечении таймера. Это уменьшает количество системных вызовов на пакет с интенсивным трафиком, делая захват более эффективным. См. [Документ BPF] (http://www.tcpdump.org/papers/bpf-usenix93.pdf). –