Sockets 从Linux内核获取套接字的详细信息

Sockets 从Linux内核获取套接字的详细信息,sockets,linux-kernel,Sockets,Linux Kernel,我有一个用户空间应用程序,它创建了几个原始套接字(使用不同协议的AF_INET和AF_数据包族)。 为了帮助调试,我需要以编程方式显示这些套接字的详细信息(例如,在这些套接字上排队的字节数/数据包数) 我尝试使用FIONREAD ioctl和recv with MSG_PEEK标志,但这两个都只提供套接字中排队的第一个数据包的字节数 因此,我似乎需要读取“/proc/PID/net/raw”文件以获得所需的详细信息。 Q1:有更好的方法吗? Linux内核只将AF_INET系列的套接字添加到其原

我有一个用户空间应用程序,它创建了几个原始套接字(使用不同协议的AF_INET和AF_数据包族)。 为了帮助调试,我需要以编程方式显示这些套接字的详细信息(例如,在这些套接字上排队的字节数/数据包数)

我尝试使用FIONREAD ioctl和recv with MSG_PEEK标志,但这两个都只提供套接字中排队的第一个数据包的字节数

因此,我似乎需要读取“/proc/PID/net/raw”文件以获得所需的详细信息。 Q1:有更好的方法吗?

Linux内核只将AF_INET系列的套接字添加到其原始套接字哈希表中,而不添加AF_数据包系列的套接字。因此,“/proc/PID/net/raw”文件中只列出AF_INET系列的套接字。 Q2:有没有办法获取AF\U数据包系列的套接字的详细信息?

通过读取“/proc/PID/net/raw”文件,我可以获得内核发送和接收队列中的字节数。 Q3:我能以某种方式获得排队的数据包数吗?

任何帮助都将不胜感激


p、 s:我的程序是C语言的,但我也很乐意看一下其他语言的代码片段。

这是对问题2的回答

不,不可能获得AF_数据包系列的套接字的详细信息(至少不能通过Linux内核)。这是因为对于AF_数据包系列的套接字,内核中的整个协议栈被跳过,数据包被直接传递到创建套接字的用户空间应用程序