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

Nic*_*ang 5 c linux wifi libpcap

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

我正在研究atheros wifi芯片.使用设备将设备设置为监控模式

airmon-ng start wlan0
Run Code Online (Sandbox Code Playgroud)

我确信有足够的流量可以收听,因为我可以看到wireshark中的软件包.谢谢.

小智 5

我用的是10000

to_ms参数pcap_open_live(),并pcap_set_timeout()以毫秒为单位.

10000毫秒是10秒.

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

我阅读了关于这个领域的教程:"至少在某些平台上,这意味着您可能要等到足够数量的数据包到达才能看到任何数据包,因此您应该使用非零超时"

有问题的教程是tcpdump.org"如何使用libpcap"教程,并在此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.
Run Code Online (Sandbox Code Playgroud)

所以我很熟悉它.:-)

我必须花一些时间查看Linux内核代码(再次),看看0的超时值会对新内核产生什么影响.但是,在编写使用libpcap/WinPcap进行实时捕获的代码时,您应该总是表现得像为这样的平台编写代码一样; 然后,您的代码将更易于移植到其他平台,并且如果零超时的行为发生更改,则不会中断.

  • "当一个包到达时,是不是立即调用了回调函数?" 当数据包到达时,有一些数据包捕获机制(除了AIX之外的所有BPF,Solaris上的DLPI,Linux上的TPACKET_V3,Windows上的WinPcap),它都放在一个缓冲区中.后续数据包放在缓冲区之后; 缓冲区在填满或计时器到期时传递给用户空间.这减少了流量大的每个数据包的系统调用次数,从而提高了捕获效率.见[BPF文件](http://www.tcpdump.org/papers/bpf-usenix93.pdf). (2认同)