gpt4 book ai didi

python - 猴子修补套接字库以使用特定的网络接口(interface)

转载 作者:太空宇宙 更新时间:2023-11-04 04:28:42 24 4
gpt4 key购买 nike

我一直在尝试使用 requests 库向网站发出请求,但使用的是不同的网络接口(interface)。以下是我尝试使用但没有奏效的答案列表。

answer描述了如何实现我想要的,但是它使用了pycurl。我可以使用 pycurl,但我已经了解了这个猴子修补程序并想尝试一下。

这个其他answer起初似乎有效,因为它不会引发任何错误。但是,我使用 Wireshark 监控我的网络流量,数据包是从我的默认接口(interface)发送的。我试图在答案作者定义的函数 set_src_addr 中打印消息,但消息没有显示出来。因此,我认为它正在修补一个从未被调用的函数。我收到 HTTP 200 响应,这不应该发生,因为我已将我的套接字绑定(bind)到 127.0.0.1。

import socket

real_create_conn = socket.create_connection

def set_src_addr(*args):
address, timeout = args[0], args[1]
source_address = ('127.0.0.1', 0)
return real_create_conn(address, timeout, source_address)

socket.create_connection = set_src_addr

import requests
r = requests.get('http://www.google.com')
r

<Response [200]>

我也试过这个answer .使用此方法我会遇到两种错误:

import socket                  
true_socket = socket.socket
def bound_socket(*a, **k):
sock = true_socket(*a, **k)
sock.bind(('127.0.0.1', 0))
return sock
socket.socket = bound_socket
import requests

这将不允许我创建套接字并引发此 error .我还尝试对这个答案进行变体,如下所示:

import requests                           
import socket
true_socket = socket.socket
def bound_socket(*a, **k):
sock = true_socket(*a, **k)
sock.bind(('192.168.0.10', 0))
print(sock)
return sock
socket.socket = bound_socket
r = requests.get('https://www.google.com')

这也不起作用并引发此 error .

我有以下问题:我想让每个进程通过特定的网络接口(interface)发送请求。我认为由于线程共享全局内存(包括库),我应该更改我的代码以使用进程。现在,我想在某个地方应用猴子补丁解决方案,这样每个进程都可以使用不同的接口(interface)进行通信。我错过了什么吗?这是解决此问题的最佳方法吗?

编辑:我还想知道不同的进程是否有可能拥有同一个库的不同版本。如果它们是共享的,我如何在 Python 中拥有不同版本的库(每个进程一个)?

最佳答案

这似乎适用于 python3:

In [1]: import urllib3

In [2]: real_create_conn = urllib3.util.connection.create_connection

In [3]: def set_src_addr(address, timeout, *args, **kw):
...: source_address = ('127.0.0.1', 0)
...: return real_create_conn(address, timeout=timeout, source_address=source_address)
...:
...: urllib3.util.connection.create_connection = set_src_addr
...:
...: import requests
...: r = requests.get('http://httpbin.org')

失败并出现以下异常:

ConnectionError: HTTPConnectionPool(host='httpbin.org', port=80): Max retries exceeded with url: / (Caused by NewConnectionError("<urllib3.connection.HTTPConnection object at 0x10c4b89b0>: Failed to establish a new connection: [Errno 49] Can't assign requested address",))

关于python - 猴子修补套接字库以使用特定的网络接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53055104/

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