You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下C/C++如何获取外部进程socket的远程对端地址

匹配失败的核心原因
  • 协议类型不匹配:示例中44000端口的监听和对应服务端侧ESTABLISHED连接为IPv6协议,相关信息存储在/proc/net/tcp6路径下,你仅查询了仅保存IPv4 TCP连接的/proc/net/tcp,拿到的inode是客户端侧IPv4连接的inode,和服务端进程的socket inode分属不同连接,自然无法匹配。你可执行grep ABE0 /proc/net/tcp6查询服务端连接的inode,就能和/proc/531903/fd下的socket id对应上。
  • 网络命名空间不一致:如果目标进程运行在独立的网络命名空间中,根路径下的/proc/net/*为当前shell所属网络命名空间的内容,和目标进程的网络命名空间数据不互通。你需要读取/proc/531903/net/tcp、/proc/531903/net/tcp6路径下的文件,才能拿到目标进程网络命名空间内的socket条目。
  • 连接归属区分:netstat输出中45350->44000和44000->45350是两条独立的TCP连接,分属客户端和服务端两个不同进程,inode本身就不相同。
推荐实现方案

优先使用eBPF原生读取

你已经在eBPF层挂钩accept系统调用,不需要跳转用户态做匹配,可直接在内核态获取对端地址,性能最高:

  • 在sys_exit_accept/sys_exit_accept4的tracepoint处理逻辑中,拿到返回的新socket文件描述符后,通过bpf_fdget获取对应的socket结构体指针
  • 直接读取结构体中sk_daddr(IPv4对端地址,小端序)、sk_dport(对端端口,大端序)、sk_v6_daddr(IPv6对端地址)字段即可拿到完整的对端地址信息,无需额外的用户态匹配逻辑。

如果需要在用户态批量查询socket信息,可使用NETLINK_SOCK_DIAG(原inet_diag)Netlink接口:

  • 该接口支持按协议、inode、端口等条件精准过滤查询,不需要遍历全量socket条目,性能远高于解析/proc文件
  • 可直接返回socket的五元组、inode、所属进程等全量信息,常用的ss命令底层就是基于该接口实现。你可以指定inode作为过滤条件,单次查询即可拿到对应socket的对端地址。

手动验证方法

如果需要手动校验匹配关系,可使用ss命令替代netstat,执行ss -t -p 'sport = :44000'即可直接输出服务端侧连接对应的进程PID、socket inode、五元组信息,不需要手动解析proc文件。

内容的提问来源于stack exchange,提问作者drus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 11:24:03