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

时间:2012-10-05 08:44:57

标签: sockets linux-kernel

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

我尝试使用FIONREAD ioctl,并使用MSG_PEEK标志recv,但这两个只给出了在套接字中排队的第一个数据包的字节数。

所以看来我需要读取“/ proc / PID / net / raw”文件来获取我需要的详细信息。 Q1:还有更好的方法吗?

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

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

任何帮助都将受到高度赞赏。

p.s:我的程序在C中,但我也很乐意看到其他语言的代码片段。

1 个答案:

答案 0 :(得分:0)

这是对问题#2的回应。

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