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

Pan*_*nos 3 linux kernel network-programming ipv6 linux-kernel

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

谢谢!

Fre*_*red 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));
Run Code Online (Sandbox Code Playgroud)

这里有多少修饰符以及它们如何打印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
Run Code Online (Sandbox Code Playgroud)

对于较旧的内核,您需要使用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));
Run Code Online (Sandbox Code Playgroud)

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