Sockets 我能找到正在处理我的套接字的网络接口/设备吗?
假设我从Sockets 我能找到正在处理我的套接字的网络接口/设备吗?,sockets,posix,ioctl,getsockopt,Sockets,Posix,Ioctl,Getsockopt,假设我从socket(2)中得到了一个文件描述符,并且我在上面做了一个connect(2)——以后有没有办法(从运行的程序内部)确定底层传输可能使用的网络设备?在fd上调用stat(2),设备编号为0;ioctl(2)或getsockopt(2)选项似乎都不适用。通过accept呼叫,您应该能够获得远程客户端的ip地址(见Beej的)。假设没有任何非对称路由,可以在本地路由表中查找到该地址的路由。路由表应该告诉您使用哪个以太网设备向远程客户端发送数据包 编辑: 您可以使用以下命令行工具查询具有远
socket(2)
中得到了一个文件描述符,并且我在上面做了一个connect(2)
——以后有没有办法(从运行的程序内部)确定底层传输可能使用的网络设备?在fd上调用stat(2)
,设备编号为0;ioctl(2)
或getsockopt(2)
选项似乎都不适用。通过accept
呼叫,您应该能够获得远程客户端的ip地址(见Beej的)。假设没有任何非对称路由,可以在本地路由表中查找到该地址的路由。路由表应该告诉您使用哪个以太网设备向远程客户端发送数据包
编辑:
您可以使用以下命令行工具查询具有远程客户端地址的本地路由表:
ip route get <remote-client-ip-addr>
ip路由获取
没有万无一失的方法可以做到这一点——当然也没有兼容posix的方法
然而,在实践中,99%的时间都可以轻松确定接口。完成
connect
后,使用getsockname
获取IP地址,然后在框中的可用接口列表中查找具有匹配IP地址的接口。用于检索接口及其IP地址的列表。此外,在Linux 3.8+中,getsockopt()
支持SO\u BINDTODEVICE
选项,因此该选项还可以告诉您套接字绑定到哪个接口。