我正在使用getaddrinfo在Windows上从C ++进行DNS查询。我以前使用Windows API DnsQuery并且工作正常,但是当我向我的软件添加IPv6支持时,我切换到了getaddrinfo。从那时起,我见过以下内容:
我的问题是有时候getaddrinfo需要很长时间才能完成。来自getaddrinfo的典型响应只需几毫秒,但大约是10000次中的1次,需要更长的时间,在某些情况下大约需要15秒,但有几种情况需要几分钟。
我在服务器上运行Wireshark并分析了我的应用程序调试日志,并看到以下内容:
这里奇怪的是,实际的DNS查询只需要十分之一秒,但getaddrinfo实际执行的时间要长得多。
许多用户已经报告了这个问题,所以这不是我的机器特有的。
那么getaddrinfo除了联系DNS服务器之外还做什么呢?
编辑:
编辑2
答案 0 :(得分:4)
Windows有一个执行DNS缓存的本地守护程序。您对getaddrinfo()的调用将被路由到该守护程序,该守护程序可能在将查询提交到DNS服务器之前检查其缓存。
有关禁用缓存的详细信息,请参阅Windows Knowledge Base article 318803。
<强> [编辑] 强>
听起来好像您的Windows Server 2003实例未正确配置IPv6。一旦IPv6查找超时,它将回退到IPv4。可能有用的知识库文章包括:
不幸的是,我无法访问任何Windows服务器,因此我无法自行测试/复制。