使用libpcap,有没有办法确定从离线pcap文件中捕获的数据包的文件偏移量?

时间:2012-07-27 04:55:47

标签: c++ libpcap

我正在编写一个程序来重建Snort捕获的TCP流。我读过的关于会话重建的大部分例子都是:

  • 将整个pcap文件加载到内存中以开始(由于硬件限制以及某些捕获文件大小为10 GB的事实而不是解决方案)或
  • 将每个数据包缓存在内存中,因为它会通过捕获进行读取并丢弃不相关的数据包;这与将整个文件读入内存基本上存在相同的问题

我目前的解决方案是编写自己的pcap文件解析器,因为格式很简单。我将每个数据包的偏移保存在向量中,并在我通过之后重新加载每个数据包。像libpcap一样,它一次只将一个数据包流入内存;我只使用序列号和标志进行排序,而不是分组数据。与libpcap不同,它明显更慢。使用libpcap处理570 MB捕获大约需要0.9秒,而我的代码需要3.2秒。但是,我的优点是能够在不重新加载整个捕获的情况下向后搜索。

如果我坚持使用libpcap来解决速度问题,我想我可以创建一个currentOffset变量,初始值为24(pcap文件全局标题的大小),将其推送到向量每次我加载一个新数据包,并在每次用{+ 1}}调用数据包大小+ 16(对于pcap记录头的大小)时递增它。然后,每当我想读取一个单独的数据包时,我就可以使用常规方法加载它并寻求pcap_next_ex

使用libpcap有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

自己解决了这个问题。

在致电pcap_next_ex之前,我将ftell(pcap_file(myPcap))推送到vector<unsigned long>。我根据需要手动解析数据包。

EZPZ。它只需要24小时以上的大脑残疾......