2015-06-16 4 views
0

У меня есть файл pcap, захваченный wirehark, теперь мне нужно прочитать каждый его пакет и записать их в вектор структуры. Я получил проспект с записью пакетов в структуру. структура:Написание pcap-пакетов в структуру с libpcap

struct pktStruct { 
    struct pcap_pkthdr * pkt_header; // header object 
    const u_char * pkt_data; // data object 
    long time; // used to compare with each other 
}; 

код, как я сохранить каждый пакет структуры:

string resultFile = "/home/xing/Desktop/tmp.pcap"; 
char errbuff[PCAP_ERRBUF_SIZE]; 
pcap_t * resultPcap = pcap_open_offline(resultFile.c_str(), errbuff); 
struct pcap_pkthdr * header; // header object 
const u_char * data; // data object 
vector<pktStruct> pktVector; // this vector contains each pktStruct 
pktStruct myStruct; 
    while (int i=pcap_next_ex(resultPcap,&header,&data) >=0) { 

     myStruct.pkt_header = header; 
     myStruct.pkt_data = data; 
     myStruct.time = header->ts.tv_sec * 1000000 + header->ts.tv_usec; 
     pktVector.push_back(myStruct); 
    } 

, когда я напечатал информацию каждого пакета, я обнаружил каждую структуру, сохраненную пакет полностью одинаковы. я сохранил тот же пакет для каждой структуры вектора?

ответ

0

Точки заголовка и указатели данных, которые вы получаете из libpcap/WinPcap, равны не действительны навсегда.

Если вы используете pcap_loop() или pcap_dispatch(), после возврата вашего обратного вызова эти заголовки пакетов и указатели данных, переданные вашему обратному вызову, не будут указывать на те же данные, что и при обратном вызове.

Если вы используете pcap_next() или pcap_next_ex(), после того, как вы сделаете другой вызов рассматриваемой процедуры, предыдущие указатели, которые вы получили от этой процедуры, не будут указывать на те же данные, что и раньше.

Так вы ДОЛЖНО сделать копию заголовка пакета и данных:

struct pktStruct { 
    struct pcap_pkthdr pkt_header; // header object - *not* a pointer 
    const u_char * pkt_data; // data object 
    long time; // used to compare with each other 
}; 

и

string resultFile = "/home/xing/Desktop/tmp.pcap"; 
char errbuff[PCAP_ERRBUF_SIZE]; 
pcap_t * resultPcap = pcap_open_offline(resultFile.c_str(), errbuff); 
struct pcap_pkthdr * header; // header object 
const u_char * data; // data object 
const u_char * data_copy; 
vector<pktStruct> pktVector; // this vector contains each pktStruct 
pktStruct myStruct; 
    while (int i=pcap_next_ex(resultPcap,&header,&data) >=0) { 

     myStruct.pkt_header = *header; 
     data_copy = (u_char *)malloc(myStruct.pkt_header.caplen); 
     memcpy(data_copy, data, myStruct.pkt_header.caplen); 
     myStruct.pkt_data = data_copy; 
     myStruct.time = header->ts.tv_sec * 1000000 + header->ts.tv_usec; 
     pktVector.push_back(myStruct); 
    } 

Это означает, что вам может понадобиться, чтобы освободить эти копии.

+0

Привет, спасибо за наблюдение, теперь я могу сохранить данные каждого пакета в каждой структуре. но все же каждая структура имеет одинаковую информацию заголовка. Я использовал код ниже, пытаясь сделать копию заголовка, но это не сработало правильно: 'header_copy = (pcap_pkthdr *) malloc (sizeof (header)); memcpy ((void *) header_copy, (const void *) header, sizeof (header)); myStruct.pkt_header = header_copy; 'можете ли вы дать мне некоторое руководство о том, как правильно сохранить заголовки для каждой структуры? – wangx1ng

+0

Я следил за вашим предложением и не определял свой pkt_header как указатель, и он сохранил правильный заголовок для каждой структуры, но мне нужно отсортировать вектор и использовать 'pcap_dump()', которому нужен аргумент 'pcap_pkthdr * 'для записи мой вектор в новый файл pcap. теперь я не могу использовать функцию 'pcap_dump' для записи моего вектора в новый файл pcap, так как теперь у меня нет объекта' pcap_pkthdr * ', что мне нужно сделать, чтобы написать мой вектор в pcap сейчас? – wangx1ng

+0

«struct pcap_pkthdr *» - это указатель на 'struct pcap_pkthdr'. Как и в C, в C++ оператор '&' возвращает указатель на свой операнд. (Но вы уже знали это, о чем свидетельствует использование вами оператора '&' в вызове 'pcap_next_ex()'.) –