Получение количества пакетов в файле захвата pcap?

Мне нужна программа, которая печатает количество пакетов в файле захвата, который использует формат pcap. Этот номер не кажется доступным в заголовке pcap (вероятно, потому, что он написан до начала захвата), и, похоже, в файле нет "нижнего колонтитула" с этой информацией.

Итак, я считаю, что единственный алгоритм-перебирать все пакеты и суммировать их. Он находится в O (N) и, для больших следов, довольно длинный.

Я публикую здесь, чтобы увидеть если у кого-то есть более умные идеи?

я пометил "C", потому что это язык, который я сейчас использую, но я считаю, что это независимая от языка проблема.

4 ответов


Роберт Эдмондс, автор pcaputils, упомянул мне, что в пакете Wireshark уже есть программа, делающая то, что я хочу, capinfos. Он отображает различные указания о файле 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 dev/devel)

затем скомпилируйте с помощью GCC-o myprogram myprogram.c-lpcap


единственный метод, который я знаю, - это прочитать файл, захваченный кадр захваченным кадром и увеличить "счетчик пакетов. Существует, однако, небольшой заголовок кадра, который содержит длину сохраненного кадра, поэтому вы можете искать вперед в файле по этой длине. Это не может быть быстрее, заметьте.

однако, если вы заинтересованы в том, чтобы сделать больше, чем просто подсчитать количество захваченных кадров, может иметь смысл прочитать данные и построить цепочку захваченных кадров в то время как считая их, для дальнейшего использования. Моя библиотека PCAP для Common Lisp делает это. Он читает " следующий кадр "по мере необходимости, сохраняя необработанные кадры в двойном связанном списке для облегчения навигации по будущему" следующему/предыдущему " кадру, читая больше кадров с диска по мере необходимости. Однако синтаксический анализ содержимого фрейма оставлен на усмотрение пользователя библиотеки и не применяется путем простого чтения октетов фрейма в структуру данных.