Получение количества пакетов в файле захвата 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 делает это. Он читает " следующий кадр "по мере необходимости, сохраняя необработанные кадры в двойном связанном списке для облегчения навигации по будущему" следующему/предыдущему " кадру, читая больше кадров с диска по мере необходимости. Однако синтаксический анализ содержимого фрейма оставлен на усмотрение пользователя библиотеки и не применяется путем простого чтения октетов фрейма в структуру данных.