所以我最近一直在玩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标头。输出B总是正确打印出来,但输出A偶尔会有HTTP标题加上大约7个字节的随机文本(就像这个“ï╤↔N↓ƒ♂”)。
所以问题是那些乱码文本来自哪里?只是直接打印有效载荷,如输出A与循环打印,打印每个字符,如输出B,有什么区别?
答案 0 :(得分:2)
好吧,如果它不是NUL
- 终止(\0
),它将不知道在哪里停止,因此它将打印垃圾文本。您可能想要这样做:
payload[size_payload] = '\0'; /* Before using it. */