我想将使用 netfilter 捕获的数据包中的源和目标 IP 地址转换为 char *。
在我的 netfilter 钩子(Hook)函数中,我有:
sock_buff = skb; // argument 2 of hook function
// ip_header is struct iphdr*
ip_header = (struct iphdr *)skb_network_header(sock_buff);
// now how to convert ip_header->saddr & ip_header->daddr to char *
// ip_header->saddr & ip_header->daddr are of type __be32
谢谢。
最佳答案
内核的 printf()
函数族有一个特殊的 IP 地址格式说明符(%pI4
用于 IPv4 地址,%pI6
用于 IPv6)。
因此对于 IPv4,您可以使用类似的东西:
char source[16];
snprintf(source, 16, "%pI4", &ip_header->saddr); // Mind the &!
或者写入动态分配的内存。
如果你只是想打印调试输出,你也可以使用printk()
。对于 %p
的许多其他功能,请参阅 this document .
关于使用 Linux netfilter 将源 IP 地址从 struct iphdr* 转换为等效字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9296835/