首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python在打开套接字时能选择哪个网络适配器吗?

Python在打开套接字时能选择哪个网络适配器吗?
EN

Stack Overflow用户
提问于 2011-12-08 21:10:56
回答 3查看 41K关注 0票数 26

运行python应用程序的目标机器将有三个可用的网络接口。一般来说,这三个网络将有很大的不同,但有可能这三个网络中的两个可能在类似的网络上。

在下面的示例中,我无法控制ETH 2上的目标地址(因为它是一个预先配置的系统),所以我被迫选择使用哪个适配器来编程。

我确信这将取决于操作系统如何路由连接。我希望有一种独立于平台的方法来使用python来解决这个问题,因为这个应用程序可能需要在Windows 7和Linux机器上运行。

示例代码

代码语言:javascript
运行
复制
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.0.2', 8000)) # Which device will this connect to??

正常病例

来源: 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

可能出现的故障案例

来源: 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

附加信息

适配器and 0、1和2都连接到不同的物理网络。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-09 06:01:48

在Windows上,如果您知道要使用的接口的IP地址,只需在连接之前绑定到它。在Linux上,使用JimB建议的套接字选项JimB(似乎也是一个特权调用)。

即Windows上

代码语言:javascript
运行
复制
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将阻止这些数据包跳出该框。

票数 19
EN

Stack Overflow用户

发布于 2011-12-08 21:23:08

我不能多说Windows,但在Linux上,通常在做出路由决定之前才会选择接口,因此您通常对数据包离开哪个接口没有发言权。

不过,您可以选择在Linux上使用SO_BINDTODEVICE (参见man 7 socket)。这会将套接字绑定到设备上,但是只有root才能在套接字上设置此选项。

刚刚检查,并且python库没有定义SO_BINDTODEVICE,但您可以从socket.h获得它

代码语言:javascript
运行
复制
# from socket.h
# define SO_BINDTODEVICE 25

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, 25, 'eth0')

另请参阅:

票数 24
EN

Stack Overflow用户

发布于 2011-12-08 23:54:07

SO_BINDTODEVICE听起来很合理,但通常您会根据绑定到的IP地址间接地选择设备。更常见的情况是,您只需要绑定到“”,绑定到机器的所有地址。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8437726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档