获取pcap捕获文件中的数据包数量?

时间:2009-03-25 10:28:58

标签: c pcap

我需要一个程序,它在使用pcap format的捕获文件中打印数据包的数量。这个数字似乎在pcap标题中不可用(可能是因为它是在捕获开始之前写的)并且它似乎没有文件中的“页脚”,并且包含此信息。

因此,我认为唯一的算法是遍历所有数据包并对它们求和。它在O(N)中,对于大的痕迹,很长。

我在这里发帖,看看有人有更聪明的想法吗?

我用“C”标记,因为它是我目前使用的语言,但我认为这是一个与语言无关的问题。

4 个答案:

答案 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库就是这样做的。它根据需要读取“下一帧”,将原始帧存储在双链表中,以便于将来“下一个/上一个”帧导航,根据需要从磁盘读取更多帧。但是,帧内容的解析由库用户自行决定,并且不会通过简单地将帧八位字节读入数据结构来强制执行。