【问题标题】:Getting details of sockets from Linux kernel从 Linux 内核获取套接字的详细信息
【发布时间】:2012-10-05 08:44:56
【问题描述】:

我有一个用户空间应用程序,它创建了几个原始套接字(具有不同协议的 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 系列的 socket 的详细信息?

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

任何帮助将不胜感激。

p.s:我的程序是用 C 语言编写的,但我也很乐意查看其他语言的 sn-ps 代码。

【问题讨论】:

    标签: sockets linux-kernel


    【解决方案1】:

    这是对问题 #2 的回应。

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

    【讨论】:

      猜你喜欢
      • 2012-04-23
      • 2022-08-19
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      相关资源
      最近更新 更多