Я анализирую файл 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++;
}
Вы дважды повторяете файл 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);
}
Там вы идете, не нужно ничего выделять.
Других решений пока нет …