我使用libpcap来捕获网络数据包。我的代码是
adhandle = pcap_open_live(wlan0,65536, PCAP_OPENFLAG_PROMISCUOUS, 1000,errbuf);/*open interface*/
pcap_next_ex(adhandle, &pheader, &pkt_data);/*capture packet*/
ip_header* ih = (ip_header*)(pkt_data+14);
tcp_header* th = (tcp_header*)(ih+20);
在上面的代码中,pkt_data指向ether头。我希望我指向ip header并指向tcp header。
好吧,我用gdb来调试。我打印了这三个指针。 Pkt_data指向0x603cd0
。我指向0x603cde
。我指向正确的位置。因为ih减去pkt_data是0xe
,等于14。
但指向0x603ebe
。为什么指向0x603ebe
?我认为应该指向0x603cf2
。因为0x603cf2
等于ih加20?
如果我使用tcp_header* th = (tcp_header*)(pkt_data+34);
。这将是0x603cf2
,这是正确的位置。为什么使用pkt_data+34
将起作用。但ih+20
无法正常工作。
我很困惑。你能救我吗?
答案 0 :(得分:2)
ip_header* ih = (ip_header*)(pkt_data+14); tcp_header* th = (tcp_header*)(ih+20);
这就是指针运算在C中的工作方式:地址增加,使得th
指向远离你开始的地方的20 ip_header
个数据。这意味着地址随着20 * sizeof ip_header
而增加。
而不是那样,你想要跳过 20个字节你可以使用:
tcp_header* th = (char *)ih + 20;