运行python应用程序的目标计算机将具有三个可用的网络接口(interface)。通常,所有三个网络都将有很大的不同,但是,这三个中的两个可能存在于相似的网络上。
在下面的示例中,我无法控制ETH 2上的目标地址(因为它是预配置的系统),因此我不得不选择要以编程方式使用的适配器。
我相当确定这将取决于操作系统如何路由连接。我希望有一种使用python来解决该问题的独立于平台的方法,因为该应用程序可能需要在Windows 7和Linux机器上运行。
示例代码
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.0.2', 8000)) # Which device will this connect to??
普通情况下
可能的故障案例
附加信息
适配器ETH0、1和2都连接到不同的物理网络
最佳答案
在Windows上,如果知道要使用的接口(interface)的IP地址,则只需在连接前绑定(bind)该IP地址即可。在Linux上,按照JimB的建议使用套接字选项SO_BINDTODEVICE(似乎也是特权调用)。
即在Windows上
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('192.168.0.1', 0))
s.connect(('...'))
在Windows下绑定(bind)源地址,即使该IP地址的路由度量成本较高,也会选择与该设备具有相同IP地址的接口(interface)。但是,这在Linux下不起作用,因为它总是用所选设备的IP地址覆盖源地址。路由仅基于目标地址来完成。似乎唯一的异常(exception)是,如果将源地址设置为127.0.0.1,那么Linux会阻止这些数据包从该包装箱中取出。