运行 python 应用程序的目标计算机将具有三个可用的网络接口。一般来说,所有三个网络都会有很大不同,但是三个网络中的两个可能位于相似的网络上。
在下面的示例中,我无法控制 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??
正常情况
- ETH 0 来源:192.168.0.1
- ETH 0 目的地:192.168.0.2
- ETH 1 来源:10.20.30.1
- ETH 1 目的地:10.20.30.2
- ETH 2 来源:60.50.40.1
- ETH 2 目的地:60.50.40.1
可能出现的问题案例
- ETH 0 来源:192.168.0.1
- ETH 0 目的地:192.168.0.2
- ETH 1 来源:10.20.30.1
- ETH 1 目的地:10.20.30.2
- ETH 2 来源:192.168.0.3
- ETH 2 目的地:192.168.0.2
附加信息
适配器ETH0、1和2都连接到不同的物理网络
对于 Windows,我不能说太多,但在 Linux 上,在做出路由决定之前通常不会选择接口,因此您通常无法决定数据包离开哪个接口。
不过,您确实可以选择使用SO_BINDTODEVICE
(see man 7 socket
)在 Linux 上。这将套接字绑定到设备,但是,只有 root 可以在套接字上设置此选项。
刚查了一下,python的socket库没有SO_BINDTODEVICE
已定义,但你可以从socket.h
:
# from socket.h
# define SO_BINDTODEVICE 25
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, 25, 'eth0')
也可以看看:
- Linux:如何强制使用特定的网络接口? https://stackoverflow.com/questions/563235/linux-how-do-i-force-a-specific-network-interface-to-be-used
- 如何创建到特定网络接口的传出套接字? https://stackoverflow.com/questions/335607/how-do-i-make-an-outgoing-socket-to-a-specific-network-interface
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)