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

bor*_*yer 13 c pcap

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

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

我在这里发帖,看看有人有一个聪明的主意吗?

我用"C"标记,因为它是我目前使用的语言,但我相信这是一个与语言无关的问题.

bor*_*yer 15

pcaputils的作者罗伯特埃德蒙兹向我提到,在Wireshark软件包中已经有一个程序可以做我想要的,capinfos.它显示有关pcap文件的各种指示,包括它包含的数据包数.

阅读代码源,它似乎按顺序遍历整个文件.


UnX*_*UnX 8

如果您想要pcap 中的帧数

tshark -r test.cap | wc -l
Run Code Online (Sandbox Code Playgroud)

使用 capinfos:

capinfos test.cap | grep "Number of packets"| tr -d " " | cut -d ":" -f 2
Run Code Online (Sandbox Code Playgroud)

使用 tcpdump:

tcpdump -r test.cap 2>/dev/null| wc -l
Run Code Online (Sandbox Code Playgroud)

所以基本上,使用 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;
}
Run Code Online (Sandbox Code Playgroud)

注意:您需要安装 libpcap 标头(在 Linux 上搜索 libpcap dev/devel 包)

然后使用 gcc -o myprogram myprogram.c -lpcap 进行编译

  • 或者只运行 capinfos,它与 tshark 一样,是 Wireshark 发行版的一部分,它的工作量要少得多,并且会更快地生成答案。 (2认同)

小智 5

确定文件中有多少个数据包的唯一方法是读取整个文件。实际上,文件头中没有数据包计数(因为该格式被设计为可一次性写入),并且实际上没有页脚。