使用libpcap将pcap包写入结构

时间:2015-06-16 10:34:31

标签: pcap libpcap winpcap

我有一个被wireshark捕获的pcap文件,现在我需要读取它的每个数据包并将它们写入结构向量。我在将一些数据包写入结构时遇到了一些问题。 结构:

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);
    }

当我打印每个数据包的信息时,我发现存储数据包的每个结构都是完全相同的。我是否将相同的数据包保存到向量的每个结构中?

1 个答案:

答案 0 :(得分: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);
    }

这意味着您可能需要释放这些副本。