我能找到什么网络接口/设备处理我的套接字?

问题描述:

假设我从socket(2)得到了一个文件描述符,并且我已经对它做了connect(2) - 以后有什么办法可以确定(从正在运行的程序中)哪个网络设备可能用于底层传输?在fd上调用stat(2)给出的设备号码为0; ioctl(2)getsockopt(2)选项都不适用。我能找到什么网络接口/设备处理我的套接字?

accept调用你应该能够得到远程客户端的IP地址(在Beej's上看到here)。假设您没有任何不对称路由,您可以在本地路由表中查找到该地址的路由。路由表应该告诉你使用什么以太网设备将数据包发送到远程客户端。

编辑:

你可以使用下面的命令行工具与远程客户端的地址来查询本地路由表:

ip route get <remote-client-ip-addr> 

有没有万无一失的办法做下去 - 当然不是一个POSIX符合要求的方式。

但是,在实践中,您可以轻松地确定99%的时间界面。完成connect后,使用getsockname获取IP地址,然后查看包装箱上可用接口的列表,找到具有匹配IP地址的接口。

+0

使用['getifaddrs()'](http://man7.org/linux/man-pages/man3/getifaddrs.3.html)检索接口列表及其IP地址。 –

+0

另外,在Linux 3.8+中,'getsockopt()'支持'SO_BINDTODEVICE'选项,所以也可以告诉你套接字绑定到哪个接口。 –