7

有没有办法使用获取所有打开的套接字?我知道lsof命令,这就是我正在寻找的,但是如何在应用程序中使用它呢?

这个想法是通过它的port编号和pid.

4

5 回答 5

4

只需打开 /proc/net 中的文件,例如 /proc/net/tcp、/proc/net/udp 等。无需费力地通过 lsof 源。:)

于 2010-12-17T13:19:21.857 回答
3

如果您不想复制/粘贴或重新实现 lsof 代码块,并且它没有构建您可以利用的任何有用的库,您仍然可以打开一个lsof进程的管道并仔细阅读它的输出。

于 2010-12-17T11:59:26.927 回答
2

检查 lsof 来源?

ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/

于 2010-12-17T11:47:26.510 回答
2

lsof命令是专门准备的,以便它可以从包括 C 在内的其他程序中使用,有关更多信息,请参阅部分:其他程序的输出。man lsof例如,您可以调用lsofwith -F p,它将输出以为前缀的进程的pid'p'

$ lsof -F p /some/file
p1234
p4321

然后,您可以使用 popen 在子进程中执行此命令并从其标准输出中读取。

于 2014-09-24T09:13:40.783 回答
0

在 C(或 C++)中,您可以使用该NETLINK_SOCK_DIAG接口。这是一个套接字,可让您访问所有这些信息。您可以过滤各种参数,例如套接字所连接的接口。

但是,文档是备用的,但是我编写了一个低级测试,以查看是否可以在有人打开新套接字时获取事件,但这不起作用。话虽如此,要列出现有的套接字,您可以使用以下代码作为一个很好的起点:

NETLINK/SOCK_DIAG 接口能否用于监听所述套接字的 `listen()` 和 `close()` 事件?

我认为这比解析/proc/net/tcp和其他类似文件更干净。你得到相同的信息,但它以二进制形式提供给你。

libnml使用作为套接字层的库也可能更简单。它对所有呼叫进行许多额外的验证。然而,就像基本NETLINK接口一样,它没有很好的文档记录(即绑定是否重要,可以与 TCP 或 UDP 一起使用的标志等)。好消息是:您始终可以阅读源代码以更好地了解正在发生的事情。

于 2021-07-18T17:16:44.530 回答