代码之家  ›  专栏  ›  技术社区  ›  bortzmeyer

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

  •  12
  • bortzmeyer  · 技术社区  · 17 年前

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

    所以,我认为唯一的算法是循环所有的数据包并求和。它在O(N)中,对于较大的记录道,相当长。

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

    4 回复  |  直到 17 年前
        1
  •  17
  •   bortzmeyer    17 年前

    《pcaputils》一书的作者罗伯特·埃德蒙兹(Robert Edmonds)向我提到,Wireshark软件包中已经有一个做我想做的事情的程序,capinfos。它显示关于pcap文件的各种指示,包括它包含的数据包数。

    在阅读源代码时,它似乎是通过按顺序遍历整个文件来工作的。

        2
  •  5
  •   user862787 user862787    14 年前

    只有

        3
  •  4
  •   UnX    12 年前

    如果你想要 数字 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;
    }
    

    然后用gcc-omy程序myprogram.c-lpcap编译

        4
  •  1
  •   Vatine    17 年前

    我知道的唯一方法是读取文件,逐帧捕获并增加一个“数据包计数器”。但是,有一个小的帧头包含存储帧的长度,因此您可以按该长度在文件中向前搜索。请注意,它可能不会更快。