c - Linux C - 将 `iphdr->daddr` 转换为等效字符串 - 不再起作用了吗?

标签 c linux header ip

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/

相关文章:

linux - 如何从 ssh 配置中删除默认 ssh 主机?

linux - 防止将颜色从 cli 复制到 txt 文件

php - 通过邮政发送的密码安全吗?

c - 以编程方式验证 X509 证书和私钥匹配

c - 警告 : expression result unused

c - Do While 不在 CUDA 内核中工作

c++ - ldconfig 命令恢复到以前的库版本

java - Postman 中的 GET 请求发送 header 中的值,但未到达 Java 中的 REST 方法

php - 更改标题二十一的大小

c - 重复输入直到回答正确