【发布时间】:2021-06-18 07:45:56
【问题描述】:
pcap回调函数返回IP头和数据如下:
void packet_handler(u_char* param, const struct pcap_pkthdr* header, const u_char* pkt_data);
我的理解是 pkt_data 的前 4 位是 IP 版本,我可以从中确定它是 IPv4 还是 IPv6。但是,我尝试了几种不同的方法来读取前 4 位,但我得到的数据没有意义。
例如,我定义了如下结构:
struct ipdata {
u_char version : 4;
u_char dontcare : 4;
};
然后我尝试使用此代码获取 ip 版本:
ipdata* pipdata;
pipdata = (ipdata*) pkt_data;
ip_ver = pipdata->version;
printf(" %d ", ip_ver);
上述方法打印的值是 3、6、9、8 和 12。如果我在 Wireshark 中同时观察流量,我发现大部分数据包都是 IPv6。
做过这件事的人能否解释一下我将如何阅读 IP 版本?
【问题讨论】:
-
“没有意义”是什么意思?你得到了什么价值观?
-
你的“几种不同的方式”是什么?请发帖Minimal, Reproducible Example。
-
IP 版本应该从它下面的层知道。仅仅从第一个字节获取它是不可靠的。
-
嗯,第一个数据可能是ETHERNET地址。 Programming with pcapTCPDUMP/LIBPCAP public repository
-
感谢您的所有回复。我添加了一种尝试获取前 4 位和我看到的输出的方法。
标签: c ip packet-sniffers packet-capture