【问题标题】:How to get a list of open sockets in Linux using C?如何使用 C 获取 Linux 中打开的套接字列表?
【发布时间】:2010-10-24 21:52:29
【问题描述】:

有没有办法在用户空间或内核中使用 C 来获取 Linux 中所有打开的套接字(套接字地址或套接字描述符)的列表?

谢谢

【问题讨论】:

    标签: c linux networking sockets kernel


    【解决方案1】:

    打开并阅读以下内容:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢您的示例。我只是要检查 /proc/self/fd 并检查哪些链接是套接字并以这种方式生成列表。我将在这里发布我的解决方案的更新。再次感谢
      • 链接似乎不再有效,虽然谷歌搜索它找到了几个副本。
      【解决方案3】:

      在目录 /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 所指出的之外,还有很好的工具。谢谢。
      【解决方案4】:

      原始数据可以在 /proc/net/tcp、/proc/net/udp 等中找到。请参阅第一行的标题以获得(简洁的)描述。

      【讨论】:

        猜你喜欢
        • 2023-03-11
        • 1970-01-01
        • 2013-04-22
        • 2021-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-18
        • 1970-01-01
        相关资源
        最近更新 更多