我正在分析一个pcap文件(离线模式)。首先,我需要计算文件中已包含的数据包数量。为此,我使用“pcap_next_ex()”循环文件,并始终正常工作。我的第二个目的是挑选每个数据包时间戳,以便再次调用“pcap_next_ex()”以循环pcap文件并填充时间戳数组(我根据pcap文件中包含的数据包数量动态创建)。 / p>
问题是当调用“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++;
}
答案 0 :(得分:2)
你正在迭代两次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);
}
你去,不需要分配任何东西。