Linux 来自struct inet_sock的可打印IPv6地址和端口

Linux 来自struct inet_sock的可打印IPv6地址和端口,linux,network-programming,linux-kernel,kernel,ipv6,Linux,Network Programming,Linux Kernel,Kernel,Ipv6,您知道从inet_sock结构以可读格式打印ipv6地址及其端口的方法吗? 我的问题有两部分。一个是哪些是具有此信息的结构成员,第二个是如何以可读格式打印它们 谢谢 printk有新的修饰符,可以帮助打印inet地址(我认为是从内核2.6.24开始的)。因此,您可以尝试几种方法,例如: //destination address printk("%pI6 %d\n", my_inet_socket->pinet6->daddr, ntohs(

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


谢谢

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地址。你可以查看更多信息

%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。它有大量的例子。希望这对您有所帮助

您是想从内核内部还是从用户空间执行此操作?因此套接字与ipv4中的套接字相同,对吗?谢谢你的回复。我知道新的printk格式,但我想针对旧的内核。AFAIK
inet_sock
到处都是ipv4格式,ipv6格式位于pinet6中。所以我想还是一样。