微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Linux上的C/C++中获取外部进程套接字的远程对等地址?

如何解决如何在Linux上的C/C++中获取外部进程套接字的远程对等地址?

我正在开发一个基于 ebpf 的监控项目,用于监控 Linux 上外部进程的套接字。在监视服务器(侦听器)进程的情况下,使用 ebpf 挂钩来接受()系统调用,我可以获得为远程对等方创建的新套接字 ID。 我需要获取新创建的套接字的远程对等地址。

我知道 lsof 处理 /proc/<pid>/fd/proc/net/tcp 以根据进程 ID 过滤查询的项目。 但到目前为止,我没有看到它在 Ubuntu-20 上是如何工作的,因为我没有看到 /proc/<pid>/fd 中的套接字 ID 和 /proc/net/tcp 中的列表匹配。

示例:

# ls -al /proc/531903/fd
total 0
dr-x------ 2 dima dima  0 Jul 23 20:57 .
dr-xr-xr-x 9 dima dima  0 Jul 23 20:05 ..
lrwx------ 1 dima dima 64 Jul 23 20:57 0 -> /dev/pts/4
lrwx------ 1 dima dima 64 Jul 23 20:57 1 -> /dev/pts/4
l-wx------ 1 dima dima 64 Jul 23 20:57 10 -> 'pipe:[270323787]'
lrwx------ 1 dima dima 64 Jul 23 20:57 2 -> /dev/pts/4
lrwx------ 1 dima dima 64 Jul 23 20:57 3 -> 'socket:[2947859549]'
lrwx------ 1 dima dima 64 Jul 23 20:57 4 -> 'socket:[2952899042]'
lr-x------ 1 dima dima 64 Jul 23 20:57 5 -> 'pipe:[270323784]'
l-wx------ 1 dima dima 64 Jul 23 20:57 6 -> 'pipe:[270323784]'
# netstat -ano | grep 44000
tcp        0      0 127.0.0.1:45350         127.0.0.1:44000         ESTABLISHED off (0.00/0/0)
tcp6       0      0 :::44000                :::*                    LISTEN      off (0.00/0/0)
tcp6       0      0 127.0.0.1:44000         127.0.0.1:45350         ESTABLISHED off (0.00/0/0)
# cat /proc/net/tcp | grep ABE
  19: 0100007F:B126 0100007F:ABE0 01 00000000:00000000 00:00000000 00000000  1000        0 3167851807 1 0000000000000000 20 4 24 10 -1   

因此,3167851807/proc/net/tcp 输出中的 inode,但它与 'socket:[2952899042]' 输出中的 ls -al /proc/531903/fd 不匹配。

我缺少什么?

其次,可以使用netlink API 来查询sockets,避免解析/proc/net/tcp 目录吗?

或者有没有其他方法可以获取进程/套接字对等远程地址?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。