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

StackOverflow https://stackoverflow.com/questions/681011

  •  22-08-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

Роберт Эдмондс, автор 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 package)

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top