假设我有一个来自socket(2)
的文件描述符,并且我已经在它上面做了一个connect(2)
-以后是否有任何方法来确定(从运行的程序内部)底层传输可能使用什么网络设备?对fd上的stat(2)
的调用给出了设备号0;ioctl(2)
或getsockopt(2)
选项似乎都不适用。
没有万无一失的方法——当然不是posix兼容的方法。
然而,在实践中,99%的情况下您可以轻松地确定接口。在完成connect
之后,使用getsockname
获得IP地址,然后在盒子上的可用接口列表中查找具有匹配IP地址的接口。
从accept
调用中,您应该能够获得远程客户端的ip地址(在Beej's上看到)。假设您没有任何非对称路由,您可以在本地路由表中查找到该地址的路由。路由表应该告诉您用于向远程客户机发送数据包的以太网设备。
您可以使用以下命令行工具使用远程客户端的地址查询本地路由表:
ip route get <remote-client-ip-addr>