在Windows上,如果知道要使用的接口的IP地址,则只需在连接前绑定该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下绑定源地址,即使该IP地址的路由度量成本较高,也会选择与该设备具有相同IP地址的接口。但是,这在Linux下不起作用,因为它总是用所选设备的IP地址覆盖源地址。路由仅基于目标地址来完成。似乎唯一的例外是,如果将源地址设置为127.0.0.1,那么Linux会阻止这些数据包从该包装箱中取出。