1

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

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

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

Linux 内核只将 AF_INET 系列的套接字添加到其原始套接字哈希表中,而不是 AF_PACKET 系列的套接字。因此,“/proc/PID/net/raw”文件中仅列出了 AF_INET 系列的套接字。 Q2:有什么方法可以获取AF_PACKET 家族的sockets 的详细信息吗?

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

任何帮助将不胜感激。

ps:我的程序是用 C 语言编写的,但我也很乐意查看其他语言的代码片段。

4

1 回答 1

0

这是对问题 #2 的回应。

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

于 2013-05-05T09:29:12.610 回答