Linux C - 将 `iphdr->daddr` 转换为等效字符串 - 不再有效?

Linux C - Convert `iphdr->daddr` to equivalent string - doesn't work anymore?

关于如何使用相同的方法将 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

知道我做错了什么吗?

我现在反过来做了:

struct sockaddr_in ip;

inet_aton("127.0.0.1", &ip.sin_addr);

if(ip.sin_addr.s_addr == iph->daddr) {
    ...
}

一个问题可能是您没有从数据包中正确提取 IP-Header。在缓冲区的开头通常首先是以太网 header,然后是 IP header - 因此为了获得 IP-Header,您需要:

struct iphdr *iph = (struct iphdr*)(buf + sizeof(struct ethhdr));

希望对你有所帮助,这里还有一个nice guide

编辑

你是对的,这不是你案例中的实际问题。我自己试了一下,也只得到了地址。

经过一些研究,我认为真正的原因是像 %pI4 这样的特殊格式字符串只被这些函数的内核实现知道,而 stdlib 实现不知道。 所以这种尝试只有在开发内核模块时才有效,例如