struct iphdr
中有几个关于如何转换 IP 地址的主题。使用相同的方法到字符串(如 127.0.0.1
),例如:
Convert source IP address from struct iphdr* to string equivalent using Linux netfilter
但不知何故,他们不为我工作:
char daddr_str[16];
struct iphdr *iph = (struct iphdr*)(buf);
snprintf(daddr_str, sizeof(daddr_str), "%pI4", &iph->daddr);
printf("IP: %s\n", daddr_str);
我得到:
IP: 0x7f5870621020I
任何想法我做错了什么?
最佳答案
一个问题可能是您没有正确地从数据包中提取 IP header 。在缓冲区的开头通常首先是以太网 header ,然后是 IP header - 因此,为了获得 IP header ,您需要:
struct iphdr *iph = (struct iphdr*)(buf + sizeof(struct ethhdr));
希望它对您的情况有所帮助,这里也是 nice guide编辑
你是对的,这不是你的实际问题。我自己试了一下,也得到了地址。
经过一些研究,我认为真正的原因是这些特殊格式的字符串如
%pI4
只有这些函数的内核实现才知道,stdlib 实现不知道。所以这种尝试只会在开发内核模块时起作用,例如
关于c - Linux C - 将 `iphdr->daddr` 转换为等效字符串 - 不再起作用了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60559810/