题
我需要一个程序用于打印,它使用 PCAP格式一个在捕获文件的分组的数目>。这个数字似乎并不可在PCAP头(可能是因为它是写在捕获开始之前),它似乎并不存在“页脚”的文件中,这些信息。
所以,我认为唯一的算法是循环对所有的数据包和总结他们。它是在O(N),并且对于大的痕迹,相当长。
我张贴在这里,看看是否有人有一个聪明的想法?
我标记为“C”,因为这是我目前使用的语言,但我相信这是一个语言无关性问题。
解决方案
罗伯特·埃德蒙兹,pcaputils的作者,向我提到,已经有一个程序做我想要什么,capinfos,在Wireshark的包。它显示有关一个文件PCAP各种适应症,包括它包含的分组的数目。
读码源,似乎通过遍历整个文件,顺序地工作。
其他提示
在仅的方式来确定多少数据包是在该文件中是读取整个文件。有,实际上,没有分组在文件头数(因为该格式被设计为在一次通过可写的),并有,实际上,没有页脚。
如果你想在PCAP的帧数
tshark -r test.cap | wc -l
使用capinfos:
capinfos test.cap | grep "Number of packets"| tr -d " " | cut -d ":" -f 2
使用tcpdump的:
tcpdump -r test.cap 2>/dev/null| wc -l
因此,基本上,使用的libpcap,这里是一个例子:
#include <stdio.h>
#include <pcap.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
unsigned int packet_counter=0;
struct pcap_pkthdr header;
const u_char *packet;
if (argc < 2) {
fprintf(stderr, "Usage: %s <pcap>\n", argv[0]);
exit(1);
}
pcap_t *handle;
char errbuf[PCAP_ERRBUF_SIZE];
handle = pcap_open_offline(argv[1], errbuf);
if (handle == NULL) {
fprintf(stderr,"Couldn't open pcap file %s: %s\n", argv[1], errbuf);
return(2);
}
while (packet = pcap_next(handle,&header)) {
packet_counter++;
}
pcap_close(handle);
printf("%d\n", packet_counter);
return 0;
}
请注意:您需要安装libpcap的头文件(在Linux上搜索的libpcap开发/ devel包)
然后进行编译的gcc -o myprogram myprogram.c -lpcap
我知道的唯一方法是将读出的文件中,捕获帧通过捕获帧,并增加“分组计数器。然而,有一个小帧报头中包含的存储帧的长度,因此你可以寻求向前通过该长度的文件中。它可能不是任何更快,请注意。
不过,如果你有兴趣做比单纯计算捕获的帧的数量,可能是有意义通过数据读取和建立捕获的帧链,同时对其计数,以备将来使用。我对Common Lisp的PCAP库来实现的。它读取“下一帧”的需要的基础上,存储在双链表原始帧,以方便将来“下一个/前一个”帧导航,根据需要从磁盘读取多个帧。然而,框架内容的解析被留到图书馆用户的判断,并且不通过简单地读取该帧八位组成的数据结构执行的。