struct inet_sock中可打印的IPv6地址和端口

时间:2011-12-14 18:09:36

标签: linux network-programming linux-kernel kernel ipv6

你知道以任何方式以可读格式打印ipv6地址及其来自inet_sock结构的端口吗? 我的问题有两个部分。一个是具有此信息的结构成员,第二个是如何以可读格式打印它们。

谢谢!

1 个答案:

答案 0 :(得分:6)

printk有新的修饰符可以帮助打印inet地址(我认为自内核2.6.24以来)。因此,您可以尝试多种方式,例如:

//destination address
printk("%pI6 %d\n", my_inet_socket->pinet6->daddr, 
                    ntohs(my_inet_socket->inet_dport));
//source address
printk("%pI6 %d\n", my_inet_socket->pinet6->saddr, 
                    ntohs(my_inet_socket->inet_sport));

以下是您拥有的修改器数量以及它们如何打印IPv6地址。您可以查看http://www.kernel.org/doc/Documentation/printk-formats.txt了解详情。

%pI6 0001:0002:0003:0004:0005:0006:0007:0008
%pi6 00010002000300040005000600070008
%pI6c 1:2:3:4:5:6:7:8

对于较旧的内核,您需要使用NIP6,如下所示:

//destination address
printk(NIP6_FMT " %d\n", NIP6(my_inet_socket->pinet6->daddr), 
                         ntohs(my_inet_socket->inet_dport));
//source address
printk(NIP6_FMT " %d\n", NIP6(my_inet_socket->pinet6->saddr), 
                         ntohs(my_inet_socket->inet_sport));

最后一点,您可以从内核本身检查net / ipv6 / tcp_ipv6.c。它有很多例子。希望这可以帮助你