用于实时捕获的pcap逻辑

时间:2013-08-06 19:14:06

标签: c pcap libpcap packet-sniffers

我目前正在使用臭名昭着的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

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

再次感谢你。

1 个答案:

答案 0 :(得分:1)

从手册页:

pcap_dispatch()处理来自实时捕获或“savefile”的数据包,直到cnt数据包被处理,当前缓冲数据包的末尾进行实时捕获时,结束从''savefile'

读取时,会达到''savefile''

然后

pcap_loop()处理来自实时捕获或“savefile”的数据包,直到cnt数据包被处理,从“savefile”读取时,达到“savefile”的结尾

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