我尝试使用以下代码使用 python 建立 HTTP 连接。我自己进行 DNS 解析,因为我无法更改相关机器上的hosts
和resolv.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 添加条目后,我通过在另一台机器上复制它来验证这是问题所在,一切都像我预期的那样快。此外,值得一提的是:使用 curl 或 wget 也会生成 RDNS。
我看到了两种解决方法,但不知道如何实际实现它们:
- 理想情况下,我确实希望反向查找尽可能匹配默认行为,所以有没有办法强制此查找转到我自己提供的 dns_server(不在 resolv.conf 中)。
- 如果那不可能,我可以在某处禁用此 RDNS 吗?我可以达到 setsockopt 级别。