获取 inode 以便在 /proc/net/udp 中查找

Get inode for lookup in /proc/net/udp

本文关键字:net udp 查找 proc 获取 inode      更新时间:2023-10-16

>我正在尝试以编程方式跟踪接收缓冲区中的数据量。我正在接收 UDP 数据。在做了一些研究之后,似乎在Linux中做到这一点的唯一方法是查看/proc/net/udp。这似乎是一个很好的解决方案,直到我意识到两个应用程序可能正在侦听同一个多播组,我需要区分它们。似乎我应该通过确定我的索引节点是什么来做到这一点。

我花了一些时间研究这个问题,有人建议sockfd_lookup或sock_from_file是要走的路,但在我的 CentOS Linux 机器上,这些功能似乎不可用。

有人可以帮我找出/proc/net/udp 中的哪一行属于我的应用程序吗?

我开始使用 ioctl(handle、FIONREAD、&bytesInBuffer(调用,只是为了发现在 Linux 中,这只返回缓冲区中第一个数据报数据包的大小。

谷歌似乎建议sockfd_lookup调用可以用来获取索引节点,但我的/usr/local/include/中的grep不返回这些函数。

与我在谷歌上可以找到的一些相比,我的 linux/net.h 似乎相当简陋,其中包括像"socket"这样的结构,它有我认为具有 inode 信息的袜子成员。我在 CentOS 上的 linux/net.h 只有 58 行长,只有几个 #defines 和一个枚举。

经过一番摆弄,我注意到readlink("/proc/self/fd/$fd")(在Linux 5.3下(给了我类似的东西:

socket:[3753088]

返回。 我可以解析它并使用生成的数字在/proc/net/udp中查找相关行:

sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode ref pointer drops             
2867: 00000000:0BB8 00000000:0000 07 00000000:00000000 00:00000000 00000000  1000        0 3753088 2 000000003ae8e911 0       

说,我不明白你为什么要这样做,但没关系! 我也不确定你为什么不按袜子和同行的名字查找,这可能更容易。