【问题标题】:Get used ports and states获取使用的端口和状态
【发布时间】:2012-01-26 11:37:21
【问题描述】:

如何在 Linux 上获取已使用的端口及其状态?基本上,netstat 可以做的所有事情,但在 C 中?

【问题讨论】:

  • 是什么让您认为 netstat 不是用 C 编写的? src.gnu-darwin.org/src/usr.bin/systat/netstat.c.html 或 code.turnkeylinux.org/busybox/networking/netstat.c
  • 另外,如果netstat 已经做了你想要的,为什么还要重写呢?
  • 我不打算重写netstat,只是在我自己的一个程序中有类似的功能。

标签: c linux network-programming port netstat


【解决方案1】:

在运行 netstat 时运行 strace 将显示它发出的系统调用及其参数。

$ strace netstat
...
open("/proc/net/tcp6", O_RDONLY)        = 3
open("/proc/net/udp", O_RDONLY)         = 3
...

这通常是找出程序正在做什么或它进行的调用的好方法,如果您只需要找出在手册页上查找哪个调用,有时比查看源代码更容易。

【讨论】:

    【解决方案2】:

    嗯,对于“netstat 可以做的一切”,您可以从 netstat 本身开始。源代码在这里:

    http://net-tools.git.sourceforge.net/git/gitweb.cgi?p=net-tools/net-tools;a=blob;f=netstat.c;h=f046f09162689f258f8920c1c2af27e01cdc77f2;hb=HEAD

    需要注意的是netstat所做的大部分工作都是从/proc文件系统中获取的;看起来*_do_one 例程拥有大部分“有趣”的胆量。

    【讨论】:

    • 我并不是说这是一个幼稚的问题,我只是希望有一套方法,但我惊讶地发现它从 /proc... 读取文件是这对程序来说不是一个坏策略吗?例如,我会使用sysinfo() 来获得正常运行时间,而不是阅读/proc/uptime
    • @bean:请记住,/proc/uptime 不是标准的文件,而是直接访问内核中提供正常运行时间的设备驱动程序(以文本格式)。 /proc 中的其余部分以相同的方式工作。
    • 一般来说,/proc/sys 文件系统许多 Linux 内核子系统的首选接口。当有提供重复功能的库函数可用时,它们通常(但不总是)在 libc 中实现为对 proc 访问的包装器。我不知道,如果sysinfo 是这样的调用,但它的联机帮助页确实链接到 proc(5)。
    猜你喜欢
    • 2016-03-28
    • 2013-12-15
    • 1970-01-01
    • 2019-08-13
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    相关资源
    最近更新 更多