Получить количество пакетов в файле захвата pcap? - PullRequest
13 голосов
/ 25 марта 2009

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

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

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

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

Ответы [ 4 ]

15 голосов
/ 28 марта 2009

Роберт Эдмондс, автор pcaputils, сказал мне, что уже есть программа, делающая то, что я хочу, capinfos, в пакете Wireshark. Он отображает различные указания на файл pcap, включая количество содержащихся в нем пакетов.

Считывая исходный код, он работает, последовательно просматривая весь файл.

5 голосов
/ 30 октября 2011

Способ only для определения количества пакетов в файле - это чтение всего файла. Фактически в заголовке файла нет количества пакетов (поскольку формат был разработан для записи за один проход), а нижнего колонтитула фактически нет.

4 голосов
/ 28 марта 2014

Если вы хотите число кадров в 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

1 голос
/ 25 марта 2009

Единственный известный мне метод - это чтение файла, захваченного кадра по захваченному кадру и увеличение «счетчика пакетов». Однако есть небольшой заголовок кадра, который содержит длину сохраненного кадра, поэтому вы можете искать вперед в файле этой длины. Может быть, не быстрее, заметьте.

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

...