pcap_next_ex () не может быть использован снова, если он достигает конца файла pcap

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

Проблема в том, что при вызове «pcap_next_ex ()» (после того, как он достиг EOF), он сразу возвращает отрицательное значение, поэтому я не могу перебрать пакеты, чтобы получить метки времени и заполнить мой массив.

Для меня кажется, что указатель, который читает файл pcap, все еще застрял в EOF и должен быть повторно инициализирован, чтобы указывать на начало файла. Мое предположение верно? Если ответ да, как снова указать на начало файла pcap?

Примечание: я использую Visual-studio2008, Windows7

Это код:

pcap_t * pcap_ds = pcap_open_offline(pcap_file_name.c_str(), errbuf);

struct pcap_pkthdr *header;

const u_char *data;

// Loop through pcap file to know the number of packets to analyse

int packets_number = 0;

while (int returnValue = pcap_next_ex(pcap_ds, &header, &data) >= 0)
{
packets_number++;
}
// Prepare an array that holds packets time stamps
timeval* ts_array = (timeval *) malloc(sizeof(timeval) * packets_number);

// Loop through packets and fill in TimeStamps Array

while (int returnValue = pcap_next_ex(pcap_ds, &header, &data) >= 0)
{

ts_array->tv_sec = header->ts.tv_sec;
ts_array->tv_usec = header->ts.tv_usec;
ts_array++;
}

1

Решение

Вы дважды повторяете файл pcap только потому, что хотите знать, сколько в нем пакетов; этого можно легко избежать. Вы должны использовать std::vector или некоторая другая структура данных, которая динамически увеличивается для хранения временных меток:

pcap_t * pcap_ds = pcap_open_offline(pcap_file_name.c_str(), errbuf);
struct pcap_pkthdr *header;
const u_char *data;

std::vector<timeval> ts_array;
// Loop through packets and fill in TimeStamps Array
while (int returnValue = pcap_next_ex(pcap_ds, &header, &data) >= 0) {
timeval tv;
tv.tv_sec = header->ts.tv_sec;
tv.tv_usec = header->ts.tv_usec;
ts_array.push_back(tv);
}

Там вы идете, не нужно ничего выделять.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]