当前位置: 首页 > 面试题库 >

打开套接字时,Python是否可以选择哪个网络适配器?

那谦
2023-03-14
问题内容

运行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上,如果知道要使用的接口的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会阻止这些数据包从该包装箱中取出。



 类似资料:
  • 问题内容: 运行python应用程序的目标计算机将具有三个可用的网络接口。通常,所有三个网络都将有很大的不同,但是,这三个中的两个可能存在于相似的网络上。 在下面的示例中,我无法控制ETH 2上的目标地址(因为它是预配置的系统),因此我不得不选择要以编程方式使用的适配器。 我相当确定这将取决于操作系统如何路由连接。我希望有一种使用python来解决问题的平台独立方法,因为该应用程序可能需要在Win

  • 问题内容: 在Python中,有没有办法来检测是否给定 的网络接口 是 向上 ? 在我的脚本中,用户指定了一个网络接口,但在执行其他操作之前,我想确保该接口已启动并且已分配IP地址。 我在 Linux上 并且我是 root 。 问题答案: 如@Gabriel Samfira所建议,我使用。当IP地址与给定接口关联时,以下函数返回True。 文档在这里

  • 问题内容: 我是网络编程的新手。我有兴趣通过Java服务器和C客户端之间的套接字建立网络连接并保持连接无限打开的可能吗?我想保持连接打开状态以在客户端之间交换XML数据。 问题答案: 从理论上讲,可以无限期地打开服务器套接字;但是,使用客户端套接字是不可能的。主要原因是因为客户端套接字取决于处理数据的服务器端套接字,并且服务器套接字可能会关闭连接。 尽管可以无限期地保持连接打开,但实际情况通常会确

  • 问题内容: 我目前正在将API从C#转换为具有网络组件的Java。 C#版本似乎在其类使用期间保持输入和输出流以及套接字打开。 这样对吗? 请记住,该应用程序正在根据用户输入发送命令并接收事件,是否为每个“消息”打开一个新的套接字流更为明智? 我正在维护一个ServerSocket来监听服务器抛出的事件,但是我不确定为出站通信维护一个Socket和输出流是一个好主意。 我不太习惯套接字编程。与许多

  • 我编写了一个服务器/客户机应用程序,首先在本地运行,然后在Internet上运行。因此,我将路由器配置为接受端口xxxx上的数据,并将其转发到我的机器上,在那里我的服务器运行,并接受来自客户端套接字的连接。所以一切都运行得很好,客户端可以在那里互相发送消息。所以现在我的问题是,服务器怎么可能发送数据到其他网络中的客户端,在那里端口转发没有被激活,但当我手动尝试它时,它不起作用。 我已经试着搜索了T

  • 问题内容: 是否可以使用JavaScript打开HTML选择以显示其选项列表? 问题答案: 不幸的是,这个问题有一个简单的答案,那就是“否”