通过特定的网络接口发出Python请求

2024-05-16 08:35:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我的Raspberry Pi上有多个网络接口,它们都有相同的IP地址(192.168.3.1),但名称如下:eth1、eth2等

即使IP地址相同,是否有办法通过特定的网络接口发出请求?例如,运行eth2

这是我正在尝试运行的代码:

class Modem(object):
  BASE_URL = 'http://{host}'
  TOKEN_URL = '/api/webserver/SesTokInfo'
  session = None

  def __init__(self,host='192.168.3.1'):
    self.host = host
    self.base_url = self.BASE_URL.format(host=host)
    self.session = requests.Session()

  def switch_modem(self, state='02'):
    try:
      # Get session and verification tokens from the modem
      r = self.session.get(self.base_url + self.TOKEN_URL, timeout=10)
      _dict = xmltodict.parse(r.text).get('response', None)

Tags: selftokennonehosturlbasegetsession
1条回答
网友
1楼 · 发布于 2024-05-16 08:35:17

使用足够新鲜的请求和urllib,您可以传递额外的套接字选项。见:https://stackoverflow.com/a/35278688/745924

您可以使用它在发出请求之前在套接字上设置SO_BINDTODEVICE。例如:

import requests
import socket

class HTTPAdapterWithSocketOptions(requests.adapters.HTTPAdapter):
    def __init__(self, *args, **kwargs):
        self.socket_options = kwargs.pop("socket_options", None)
        super(HTTPAdapterWithSocketOptions, self).__init__(*args, **kwargs)

    def init_poolmanager(self, *args, **kwargs):
        if self.socket_options is not None:
            kwargs["socket_options"] = self.socket_options
        super(HTTPAdapterWithSocketOptions, self).init_poolmanager(*args, **kwargs)

interface = 'veth0'
adapter = HTTPAdapterWithSocketOptions(socket_options=[(socket.SOL_SOCKET, socket.SO_BINDTODEVICE, interface.encode('utf-8'))])
session = requests.session()
session.mount("http://", adapter)
session.mount("https://", adapter)
session.get('http://192.168.3.1')

这样做会破坏链路和ip层的分离。它确实需要root,并且由于许多其他原因可能无法工作

相关问题 更多 >