gpt4 book ai didi

python - 避免为 HTTP 请求进行 RDNS 查找

转载 作者:太空狗 更新时间:2023-10-29 12:35:16 25 4
gpt4 key购买 nike

我尝试使用 python 设置 HTTP 连接,使用以下代码。我自己进行 DNS 解析,因为我无法更改相关机器上的 hostsresolv.conf 文件。

class resolver(object):
def __init__(self, server):
self.server = server
def __call__(self, host):
res = check_output('host %s %s' % (host, self.server), shell = True)
ips = findall('has address (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})', res)
return choice(ips)

class http_connection(httplib.HTTPConnection):
dns_server = '8.8.8.8'
def connect(self):
resolv = resolver(http_connection.dns_server)
self.sock = socket.create_connection((resolv(self.host), self.port), self.timeout)
...
x = http_connection('%s:%d' % (args.host, args.port))
x.request('GET','/start/')
rep = x.getresponse()
print rep.read()

一切正常,我从 DNS 获得了一个 IP,创建了套接字(使用 ip-port 对,而不是主机名),我确实得到了答案。唯一的是,它需要很长时间,最多5-6秒。调试后我发现由于某种原因发生了对已解析 IP 的反向 DNS 查找,该查找超时。在向/etc/hosts 添加条目后,我通过在另一台机器上重现它来验证这是问题所在,一切都像我预期的那样快速运行。此外,对于它的值(value):使用 curl 或 wget 也会产生 RDNS。

我看到了两个解决此问题的选项,但无法找到如何实际实现它们:

  1. 理想情况下,我确实希望进行反向查找以匹配默认行为尽可能多,所以有没有办法强制这个查找去我自己提供的 dns_server(不在 resolv.conf 中)。
  2. 如果那不可能,我可以在某处禁用此 RDNS 吗?我可以去达到 setsockopt 级别。

最佳答案

我终于找到了自己解决这个问题的方法。显然,当我自己没有明确提供源地址并让系统选择时,就会发生这种情况。我想 Linux 会使用一些技巧来找出最适合使用的接口(interface),而 RDNS 就是其中之一。

通过如下提供 source_address,一切正常:

class http_connection(httplib.HTTPConnection):
def __init__(self, dns_server, *args, **kwargs):
httplib.HTTPConnection.__init__(self, *args, **kwargs)
self.resolv = resolver(dns_server, self.source_address)
def connect(self):
self.sock = socket.create_connection((self.resolv(self.host), self.port), self.timeout, self.source_address)
...
x = http_connection(args.dns_server, '%s:%d' % (args.host, args.port), source_address = (args.source_address, 0))

关于python - 避免为 HTTP 请求进行 RDNS 查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13275291/

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