gpt4 book ai didi

python - Python可以在打开套接字时选择什么网络适配器吗?

转载 作者:IT老高 更新时间:2023-10-28 21:17:56 31 4
gpt4 key购买 nike

运行 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??

正常情况

  • 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 上,通常在做出路由决定之前不会选择接口(interface),因此您通常对数据包离开哪个接口(interface)没有发言权。

您确实可以选择在 Linux 上使用 SO_BINDTODEVICE(参见 man 7 socket)。这会将套接字绑定(bind)到设备,但是,只有 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')

另见:

关于python - Python可以在打开套接字时选择什么网络适配器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8437726/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com