为什么 pcap_loop() 和收到数据包之间有很长的延迟?

Why is there a long delay between pcap_loop() and getting a packet?

我正在使用 libpcap 编写嗅探器。我的问题是调用 pcap_loop() 或 pcap_next() 和实际获取数据包(调用回调函数)之间有 7-10 秒的延迟。但是,如果我在同一台设备上使用带有相同过滤器的 wireshark,则在我点击 "start" 按钮后不会出现这种延迟。为什么我的程序有延迟,有没有办法解决这个问题?

我正在研究 atheros wifi 芯片。使用

将设备设置为监控模式
airmon-ng start wlan0

我确定有很多流量可以收听,因为我可以在 wireshark 中看到这些包。 谢谢。

I'm using 10000

to_ms pcap_open_live()pcap_set_timeout() 的参数以毫秒为单位。

10000 毫秒为 10 秒。

尝试使用 1000,这是 tcpdump 使用的值 - 这会将延迟减少到 1 秒 - 或者使用 100,这是 Wireshark 使用的值 - 这会将延迟减少到 1/10 秒。

I read on a tutorial about this field: " on at least some platforms, this means that you may wait until a sufficient number of packets arrive before seeing any packets, so you should use a non-zero timeout"

有问题的教程是 the tcpdump.org "How to use libpcap" tutorial,并且在这个 CVS commit 中添加了有问题的段落:

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 进行实时捕获的代码时,您应该 始终 表现得好像您正在为此类平台编写代码;然后,您的代码将更易于移植到其他平台并且如果零超时的行为发生变化也不会中断。