【问题标题】:pcap logic for live capture用于实时捕获的 pcap 逻辑
【发布时间】:2013-08-07 22:58:18
【问题描述】:

我目前正在使用臭名昭著的 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() 更改为 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>

再次感谢您。

【问题讨论】:

  • 我们能看到更多代码吗?
  • 具体开调度和统计

标签: c pcap libpcap packet-sniffers


【解决方案1】:

来自手册页:

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

那么对于

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

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

【讨论】:

  • 谢谢,这听起来像是一个很好的预感,因为它是一个 Arm 处理器。明天我会编写代码,让大家知道它是如何工作的。
  • 处理器与它无关,但 Scotty Bauer 的回答是 100% 正确的——如果你想继续捕捉,请使用pcap_loop()pcap_dispatch() 主要用于当您正在执行 select()poll()epoll() 或使用 kqueues 时,以便您正在等待几件事并只想处理可用的内容此时 从pcap_t 然后回到你的select()/etc。循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
  • 2011-09-17
  • 1970-01-01
  • 2022-01-22
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多