c++ - 使用 libpcap 解释有效负载

标签 c++ c pcap libpcap

我最近一直在玩 libpcap,我有一个简单的问题。这是有问题的代码:

while( (result = pcap_next_ex(adapterHandle, &header, &packetData)) >= 0)
{
    if(result == 0) // Packet was dropped
        continue;


    ethernet = (struct sniff_ethernet*)packetData;
    ip = (struct sniff_ip*)(packetData + SIZE_ETHERNET);
    size_ip = IP_HL(ip)*4;
    ip_len = ntohs(ip->ip_len);

    if(ip->ip_p != IPPROTO_TCP)
        continue;

    tcp = (struct sniff_tcp*)(packetData + SIZE_ETHERNET + size_ip);
    size_tcp = TH_OFF(tcp)*4;
    if(size_tcp < 20)
    {
        cout << "Invalid TCP Header" << endl;
        exit(-1);
    }

    payload = (u_char*)(packetData + SIZE_ETHERNET + size_ip + size_tcp);
    size_payload = ip_len - (size_ip + size_tcp);

    cout << "************** Output A ******************" << endl;
    cout << payload << endl;
    cout << "*************** Output B *****************" << endl;
    for(int i=0; i<size_payload; i++)
        cout << payload[i];
}

因此,在我的测试中,我将其设置为仅捕获 HTTP“GET”请求。现在在我看来,输出 A 和输出 B 的输出应该是相同的,仅打印 HTTP header 。输出 B 总是正确打印出来,但输出 A 偶尔会添加 HTTP header 以及大约 7 个字节的随机文本(就像这样“ï╤↔N↓f♂”)。

那么问题是这些乱码文本从何而来?像输出 A 中那样直接打印有效负载与像输出 B 中那样循环遍历它并打印每个字符之间有什么区别?

最佳答案

好吧,如果它不是以 NUL 结尾(\0),它将不知道在哪里停止,因此它将打印垃圾文本。您可能想做:

payload[size_payload] = '\0'; /* Before using it. */

关于c++ - 使用 libpcap 解释有效负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6682884/

相关文章:

c++ - 如何在 C++ 中进行网络 IP 扫描?

c - Gcc:访问和初始化结构中的 union 和位域

c - netinet/tcp.h 中的有效负载偏移值?

linux - 丢弃数据包有效负载的工具?

C++11 在 constexpr 函数中使用统一值初始化数组

c++ - 让 CMake 在可能的情况下选择静态链接?

c++ - C++中的拆分函数

c - C 程序中的变量段?

c - 您是否在 C 库中定义全局变量?

c - 如何在c中同时读写pcap文件