【问题标题】:How I can get ports associated to the application that opened them?如何获取与打开它们的应用程序关联的端口?
【发布时间】:2010-07-22 05:57:06
【问题描述】:

我需要获取我机器上所有打开端口的列表以及打开它们的应用程序。 我需要以编程方式获取这些信息。

谢谢。

【问题讨论】:

    标签: c++ linux


    【解决方案1】:

    您必须执行以下操作:

    1. socket=ls -l /proc/<pid>/fd | grep socket | sed 's/.*socket:\[//' | sed 's/\]//'

    2. grep $socket /proc/net/tcp

    3. 解析上一个命令的输出(第二个条目包含端口信息)

    【讨论】:

    • +1 用于在我的建议中添加一些肉。如果我正在实施,这可能就足够了。
    【解决方案2】:

    我希望会出现一个更聪明的答案。我就是这样做的(在 Python 中以编程方式),试图重写一个名为 NetHogs 的程序。我的版本is here,特别是here is the module in Python 用于解析来自/proc 的表格。如果你不是 Python 识字(去学习它),然后看看 original NetHogs,它使用了 C/C++ 的混合(并且读起来有点痛苦,因此重写了)。

    值得注意的是,从/proc 解析套接字信息的大量或快速重复尝试非常占用 CPU,因为操作系统必须处理每个系统调用,并动态解析内部结构。因此,您会在我链接到的两个项目的源代码中找到一些缓存和时间假设。

    简而言之,您需要将/proc/<pid>/fd 中为每个进程提供的套接字inode 与/proc/net/<proto> 中提供的连接相关联。同样,示例解析以及如何定位所有这些都存在于两个项目中。

    【讨论】:

    • 您重写的链接断开。
    【解决方案3】:
    exec('netstat');
    

    【讨论】:

    • netstat 告诉您哪些端口是打开的,但不是哪些应用程序打开了它们。 lsof 会这样做。
    • @n0rd:这么多年我都不知道!非常感谢您的提示,+1!
    【解决方案4】:

    打开文件(包括套接字)的信息可以从/proc目录中挖出来。

    This article 提供了很多细节并帮助您入门。

    【讨论】:

      【解决方案5】:
      ss -nltup 
      netstat -ltupn
      lsof  -iTCP -sTCP:LISTEN
      

      编辑:抱歉,不是程序化的。但如果您想分叉一个进程,这很有帮助。 每次都重新发明轮子没有意义。

      【讨论】:

        猜你喜欢
        • 2013-03-10
        • 2010-09-09
        • 2017-10-29
        • 2011-11-28
        • 2015-10-30
        • 2020-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多