【问题标题】:Writing pcap packets into a structure with libpcap使用 libpcap 将 pcap 数据包写入结构
【发布时间】:2016-08-01 21:56:29
【问题描述】:

我有一个由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);
    }

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

【问题讨论】:

    标签: pcap libpcap winpcap


    【解决方案1】:

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

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

    【讨论】:

    • 您好,感谢您的回复,现在我可以将每个数据包的数据保存到每个结构中。但是,每个结构仍然具有相同的标头信息。我使用下面的代码尝试制作标头的副本,但它不能正常工作:header_copy = (pcap_pkthdr *)malloc(sizeof(header)); memcpy((void *)header_copy,(const void *)header,sizeof(header)); myStruct.pkt_header = header_copy; 你能给我一些关于如何正确地将标头保存到每个结构的指导吗?
    • 我听从了你的建议,没有将我的 pkt_header 定义为指针,它确实将正确的标题保存到每个结构中,但我需要对向量进行排序并使用 pcap_dump() 需要 @987654329 @ 参数将我的向量写入新的 pcap 文件。现在我不能使用函数pcap_dump 将我的向量写入新的pcap 文件,因为我现在没有pcap_pkthdr * 对象,我现在需要做什么才能将我的向量写入pcap?
    • A struct pcap_pkthdr * 是指向 struct pcap_pkthdr 的指针。就像在 C 中一样,在 C++ 中,&amp; 运算符将返回一个指向其操作数的指针。 (但您已经知道这一点,正如您在对 pcap_next_ex() 的调用中使用 &amp; 运算符所表明的那样。)
    • 没错,这个乱七八糟的东西让我的大脑感到困惑!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多