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 实现不知道。
所以这种尝试只有在开发内核模块时才有效,例如
关于如何使用相同的方法将 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 实现不知道。
所以这种尝试只有在开发内核模块时才有效,例如