避免RDNS查找HTTP请求

我尝试使用pythonbuild立一个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,套接字被创build(与一个IP端口对,而不是一个主机名),我得到一个答案。 唯一的是,需要很长时间,长达5-6秒。 debugging后,我发现出于某种原因,parsingIP的反向DNS查找发生,超时。 我确认这是在另一台机器上复制它的问题,添加一个条目到/ etc / hosts后,所有的操作都像我所期望的那样快。 另外,值得一提的是:使用curl或wget也导致了RDNS。

我看到两个选项来解决这个问题,但不知道如何实际执行它们:

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

我终于找到了一个方法来解决这个问题。 显然这是在我没有明确提供源地址并让系统选择的情况下发生的。 我想,Linux会做一些技巧来找出最适合使用的接口,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))