2

我目前正在使用臭名昭著的 pcap 库编写一个数据包捕获程序,该库基于 Arch Linux Arm 并用 C 编程,但我遇到了障碍。

该设备将位于 SPAN 以太网端口中,并应收集通过交换机的所有数据,并将其保存到文件中并使用 Wireshark 离线打开以进行分析。

该程序将无错误地编译和执行;然而,统计数据只返回每次捕获 1 到 6 个数据包。出于测试目的,我已将计数设置为 20,并且我正在 ping 设备以生成流量。

程序的逻辑(不转储我的整个代码)是这样的:

pcap_open_live()  //find device
pcap_lookupnet()  //get IP and net mask
pcap_dump_open()  //open savefile
pcap_dispatch()   //capture packets & call &pcap_dump
pcap_stats()      //output capture stats to screen
pcap_dump_close() //close file
pcap_close()      //close device & free memory

代码指定了混杂模式,设备在 ifconfig'd 时通过 DHCP 获得 IP,我没有使用 bpf 过滤器,即: pcap_compile() pcap_setfilter() 作为pcap_dispatch(). 当我确实使用它时,结果在 4 到 6 个数据包之间。我已经阅读了手册页,许多网站和论坛,我只是看不到它。

如果您需要任何其他信息/代码,请询问。如果有人能指出我正确的方向,我将非常感激,我会为社区发布我的结果:)

感谢您的时间。

各位看官,谢谢。

我从pcap_dispatch()to更改为pcap_loop()捕获目标 20 个数据包。完美的。综上所述,代码逻辑如下。

pcap_open_live() //find device
pcap_lookupnet()  //get IP and net mask
pcap_dump_open()  //open savefile
pcap_loop()       //capture packets & call &pcap_dump
pcap_stats()      //output capture stats to screen
pcap_dump_close() //close file
pcap_close()      //close device & free memory

项目提交后,我会将我的完整代码发布给社区。

再次感谢你。

4

1 回答 1

1

从手册页:

pcap_dispatch() 处理来自实时捕获或“保存文件”的数据包,直到处理完cnt数据包,进行实时捕获时到达当前缓冲区的数据包的末尾,读取时到达“保存文件”的末尾来自“保存文件”

那么对于

pcap_loop() 处理来自实时捕获或“保存文件”的数据包,直到处理完cnt数据包,从“保存文件”读取时到达“保存文件”的末尾

我的预感是数据包缓冲区一次最多只能容纳 6 个数据包,当您发送时,您正在耗尽缓冲区并且它正在返回。尝试使用pcap_loop()并查看您的问题是否已解决。

于 2013-08-06T20:33:41.633 回答