【发布时间】:2016-12-30 12:10:57
【问题描述】:
假设我有一个来自socket(2) 的文件描述符,并且我已经在它上面做了一个connect(2) - 以后有什么方法可以确定(从正在运行的程序内部)可能正在使用的网络设备底层运输?对 fd 上的stat(2) 的调用给出设备号 0; ioctl(2) 或 getsockopt(2) 选项似乎都不适用。
【问题讨论】:
标签: sockets posix ioctl getsockopt
假设我有一个来自socket(2) 的文件描述符,并且我已经在它上面做了一个connect(2) - 以后有什么方法可以确定(从正在运行的程序内部)可能正在使用的网络设备底层运输?对 fd 上的stat(2) 的调用给出设备号 0; ioctl(2) 或 getsockopt(2) 选项似乎都不适用。
【问题讨论】:
标签: sockets posix ioctl getsockopt
这样做没有万无一失的方法——当然不是符合 posix 的方法。
但是,在实践中,您可以在 99% 的情况下轻松确定接口。完成connect 后,使用getsockname 获取IP 地址,然后在框上的可用接口列表中查找具有匹配IP 地址的接口。
【讨论】:
getifaddrs() 检索接口列表及其 IP 地址。
getsockopt() 支持 SO_BINDTODEVICE 选项,因此这也可能告诉您套接字绑定到哪个接口。
通过accept 调用,您应该能够获得远程客户端的IP 地址(在Beej 上看到here)。假设您没有任何非对称路由,您可以在本地路由表中查找到该地址的路由。路由表应该告诉您使用什么以太网设备将数据包发送到远程客户端。
编辑:
您可以使用以下命令行工具使用远程客户端的地址查询您的本地路由表:
ip route get <remote-client-ip-addr>
【讨论】: