我正在尝试使用 libpcap 查看进出我的环回网络适配器的 http 流量。我刚从网络编程开始,对这个库完全陌生。感谢我之前收到的答案,我成功地检测到了我机器的“lo0”适配器(Mac OSx)上的链路层类型。
//lookup link-layer header type
link_layer_type = pcap_datalink(handle);
if(link_layer_type == DLT_NULL){
printf("DLT_NULL"); // this true in the case of "lo0"
}
Programming with Pcap指南假设每个数据包都包含一个以太网标头。因此用于查找数据包有效负载的逻辑如下:
ethernet = (struct sniff_ethernet*)(packet);
ip = (struct sniff_ip*)(packet + SIZE_ETHERNET);
size_ip = IP_HL(ip)*4;
if (size_ip < 20) {
printf(" * Invalid IP header length: %u bytes\n", size_ip);
return;
}
tcp = (struct sniff_tcp*)(packet + SIZE_ETHERNET + size_ip);
size_tcp = TH_OFF(tcp)*4;
if (size_tcp < 20) {
printf(" * Invalid TCP header length: %u bytes\n", size_tcp);
return;
}
}
payload = (u_char *)(packet + SIZE_ETHERNET + size_ip + size_tcp);
当检查源自不存在以太网标头的环回接口的数据包内容时,此逻辑将不起作用。Link-Layer Header Types 文档指出,“DTL_NULL”的Link-Layer 类型包含一个 4 字节的标头,其中包含一个 PF_ 值,其中包含网络层协议(我猜在我的情况下是 IPv4)。
鉴于上述信息..如何正确定位数据包的有效负载位置?
任何指导或信息将不胜感激。谢谢!