【发布时间】:2011-05-27 02:07:05
【问题描述】:
【问题讨论】:
标签: c++ c++ c++ c sockets unix lsof
【问题讨论】:
标签: c++ c++ c++ c sockets unix lsof
只需打开 /proc/net 中的文件,例如 /proc/net/tcp、/proc/net/udp 等。无需费力地通过 lsof 源。 :)
【讨论】:
:之后进行了十六进制编码。然后,您必须使用 readlink() 扫描所有 /proc/*/fd 并解析出该符号链接的数量,例如socket:[1771485] 1771485 是 inode 编号,您会在 /proc/net/tcp(或任何其他类似文件,具体取决于它是 tcp/udp 和 ipv4 还是 ipv6 等)中找到该 inode 编号。
如果您不想复制/粘贴或重新实现 lsof 代码块,并且它没有构建任何您可以利用的有用库,您仍然可以打开一个指向 lsof 进程的管道并仔细阅读它的输出.
【讨论】:
检查 lsof 来源?
【讨论】:
lsof 命令是专门准备的,因此它可以从包括 C 在内的其他程序中使用,有关详细信息,请参阅man lsof 的其他程序的输出部分。例如,您可以使用-F p 调用lsof,它将输出以'p' 为前缀的进程的pid:
$ lsof -F p /some/file
p1234
p4321
然后您可以使用 popen 在子进程中执行此命令并从其标准输出中读取。
【讨论】:
在 C(或 C++)中,您可以使用 NETLINK_SOCK_DIAG 接口。这是一个套接字,可让您访问所有这些信息。您可以过滤各种参数,例如套接字所连接的接口。
不过,文档是备用的,但我编写了一个低级测试,以查看是否可以在有人打开新套接字时获取事件,但这不起作用。话虽如此,要列出现有的套接字,您可以使用以下代码作为一个很好的起点:
我认为这比解析/proc/net/tcp 和其他类似文件更干净。你得到相同的信息,但它以二进制形式提供给你。
使用libnml 库也可能更简单,它是套接字之上的一个层。它对所有呼叫进行许多额外的验证。然而,就像基本的NETLINK 接口一样,它的文档也不是很好(即绑定是否重要,可以与 TCP 或 UDP 一起使用的标志等)。好消息是:您始终可以阅读源代码以更好地了解什么是继续。
【讨论】: