我正在尝试编写一个程序(用 C 语言),作为其功能之一,它遍历 procfs 以查找打开的套接字并确定诸如目标/源端口/地址之类的东西(类似于 netstat 和 lsof 所做的)。但是,一旦找到套接字文件,我不确定使用哪个系统调用。例如,假设我已经打电话回来readlink
了。我可以用这些信息做什么,单独使用系统 API 来获取套接字的详细信息?/proc/123/fd/4
socket:[56789]
我试过跑步strace
,netstat
但不清楚发生了什么。我看到了read
,/proc/123/fdinfo/4
但我不明白这是怎么回事。
例如,fdinfo
一个打开的连接(到 127.0.0.1:5000 的 TCP 连接)的文件显示
pos: 0
flags: 04002
mnt_id: 9
您首先需要阅读
/proc/net/tcp
哪些列表,对于您的网络命名空间,所有打开的 TCP/IP 连接的详细信息(查看/proc/net/tcp6
TCP/IPv6 连接)。此信息包括关联的 inode 编号。该文件中的示例行是这
00000000:0016
意味着套接字正在侦听0.0.0.0
端口 22。我们知道这是一个侦听套接字,因为对等地址 (00000000:0000
) 全为零。我们可以看到这个套接字的 inode 是 19691。一旦掌握了这些数字,您就可以将它们与
/proc/<pid>/fd
. 例如,socket:[12345]
表示套接字位于 inode 12345。