当我捕获网络数据包时,为什么指针指向正确的数据包头?

时间:2014-05-08 12:11:11

标签: c pointers tcp libpcap

我使用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无法正常工作。

我很困惑。你能救我吗?

1 个答案:

答案 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;