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