如何使用C语言在Linux中获取打开的套接字列表?

8
有没有一种方法可以在Linux中使用用户空间或内核的C语言获取所有打开的套接字(套接字地址或套接字描述符)列表?
谢谢。
4个回答

19

打开并阅读以下内容:

/proc/net/tcp - 一个已打开的TCP套接字列表

/proc/net/udp - 一个已打开的UDP套接字列表

/proc/net/raw - 列出所有的“原始”套接字

这些就像是您使用文件句柄打开和读取的“常规”文件,并且将为您提供有关每个套接字的所有可能需要的信息。


4

在目录/proc/self/fd中,有一些虚假的符号链接,可以让您查看所有打开的文件描述符 - 套接字会显示类似于:

lrwx------ 1 root root 64 2009-05-08 07:45 4 -> socket:[4921]
lrwx------ 1 root root 64 2009-05-08 07:45 5 -> socket:[4918]
lrwx------ 1 root root 64 2009-05-08 07:45 6 -> socket:[5395]

使用opendir、readdir()迭代它们,然后使用readlink()进行查询。

如果您知道FD 4是一个套接字,那么可以调用getsockname()函数来获取本地地址族、地址等信息(如果已绑定)。


这并不适用于所有套接字。大多数情况下,我在这里看到我的终端。打开多个连接后,并不是所有的套接字都可见。尽管如此,这仍然是一个很好的工具,可以与Shane Mason提到的内容一起使用。谢谢。 - Misha M

4

这个程序可能对你有用,它展示了如何解析/net/proc/*文件。你可以参考sockstat.c


谢谢提供示例。我刚想浏览 /proc/self/fd 目录,检查哪些链接是套接字并以此生成列表。我会在这里发布我的解决方案更新。再次感谢。 - Misha M
链接似乎已经失效了,但是通过谷歌搜索可以找到几个副本。 - Stéphane

0

原始数据可以在/proc/net/tcp、/proc/net/udp等位置找到。请参考第一行的标题(简短)描述。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接