我需要一个程序,它在使用pcap format的捕获文件中打印数据包的数量。这个数字似乎在pcap标题中不可用(可能是因为它是在捕获开始之前写的)并且它似乎没有文件中的“页脚”,并且包含此信息。
因此,我认为唯一的算法是遍历所有数据包并对它们求和。它在O(N)中,对于大的痕迹,很长。
我在这里发帖,看看有人有更聪明的想法吗?
我用“C”标记,因为它是我目前使用的语言,但我认为这是一个与语言无关的问题。
答案 0 :(得分:15)
pcaputils的作者罗伯特·埃德蒙兹向我提到,已经有一个程序在Wireshark包中做了我想做的事,capinfos。它显示有关pcap文件的各种指示,包括它包含的数据包数。
阅读代码源,它似乎按顺序遍历整个文件。
答案 1 :(得分:5)
only 方式确定文件中有多少数据包是读取整个文件。事实上,文件头中没有数据包计数(因为格式设计为一次写入可写),实际上没有页脚。
答案 2 :(得分:4)
如果你想在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 dev / devel包)
然后使用gcc -o myprogram myprogram.c -lpcap
进行编译答案 3 :(得分:1)
我所知道的唯一方法是读取文件,通过捕获的帧捕获帧并递增“包计数器。但是,有一个小的帧头包含存储帧的长度,所以你可以向前寻找在那个长度的文件中。请注意,它可能不会更快。
但是,如果您只想简单地计算捕获的帧数,那么读取数据并在计算它们时构建一系列捕获的帧可能是有意义的,以备将来使用。我的Common Lisp的PCAP库就是这样做的。它根据需要读取“下一帧”,将原始帧存储在双链表中,以便于将来“下一个/上一个”帧导航,根据需要从磁盘读取更多帧。但是,帧内容的解析由库用户自行决定,并且不会通过简单地将帧八位字节读入数据结构来强制执行。