使用 Linux netfilter 将源 IP 地址从 struct iphdr* 转换为等效字符串

标签 c linux kernel kernel-module netfilter

我想将使用 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/

相关文章:

linux - Jenkins maven 构建在 linux 机器中失败

linux - 在哪里可以找到 cksum 的 Linux 实现,它可以完成 OSX cksum -o3 的功能?

multithreading - 在隔离的 cpu 核心上运行内核线程

operating-system - 内存映射 IO - 它是如何完成的?

debugging - 是否有在 Windows 7 x64 上启用本地内核调试的黑客/技巧

c - 有序并行代码的运行速度比单线程慢。有解决办法吗?

C - scanf() 然后是 getenv()

php - MySQL混表查询

c - 使用指针在c中打印字符串

c++ - 在 C 中添加和删除 a ( void * )