我目前正在使用臭名昭着的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
代码指定promiscous模式,ifconfig'd时设备有通过DHCP的IP,我没有使用过bpf过滤器,即:
pcap_compile()
pcap_setfilter()
作为pcap_dispatch()
的一部分。当我使用它时,结果是4到6个包。
我已经阅读了手册页,很多网站和论坛,我只是看不到它。
如果您需要任何其他信息/代码,请询问。 如果有人能指出我正确的方向,我会非常感激,我会将结果发布给社区:)
你是谁,是的,谢谢。
我从pcap_dispatch()
更改为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
提交项目时,我会将完整的代码发布给社区。 p>
再次感谢你。
答案 0 :(得分:1)
从手册页:
pcap_dispatch()处理来自实时捕获或“savefile”的数据包,直到cnt数据包被处理,当前缓冲数据包的末尾进行实时捕获时,结束从''savefile'
读取时,会达到''savefile''然后
pcap_loop()处理来自实时捕获或“savefile”的数据包,直到cnt数据包被处理,从“savefile”读取时,达到“savefile”的结尾
我的预感是数据包缓冲区一次只能容纳6个数据包,当你发送时,你正在耗尽缓冲区并且它正在返回。尝试使用pcap_loop()
,看看您的问题是否已解决。