9

我正在使用 getaddrinfo 从 Windows 上的 C++ 进行 DNS 查询。我曾经使用 Windows API DnsQuery 并且效果很好,但是在向我的软件添加 IPv6 支持时,我切换到了 getaddrinfo。从那时起,我看到了以下内容:

我的问题是有时 getaddrinfo 需要很长时间才能完成。getaddrinfo 的典型响应只需要几毫秒,但在 10000 次中大约有 1 次需要更长的时间,在某些情况下大约需要 15 秒,但有几种情况需要几分钟。

我在服务器上运行了 Wireshark 并分析了我的应用程序调试日志并看到以下内容:

  • 我调用函数getaddrinfo。
  • 15 秒后,我的机器查询 DNS 服务器。
  • 几毫秒后,我收到了来自 DNS 服务器的响应。

这里奇怪的是,实际的 DNS 查询只需要十分之一秒,但 getaddrinfo 实际执行的时间要长得多。

许多用户都报告了这个问题,所以这不是我的机器特有的问题。

那么 getaddrinfo 除了联系 DNS 服务器还能做什么呢?

编辑:

  • 有几个地址出现了问题。如果我尝试使用这些地址重现问题,则不会出现问题。
  • 我做了一些愚蠢的事情。在每次 DNS 查询时,都会解析 etc/services。但是,这并不能解释几分钟的延迟。(感谢 D.Shawley)

编辑 2

  • 我的软件进行的一种 DNS 查询是反垃圾邮件 DNSBL 查询。一位用户的日志显示,查找 ip.address1.example.com 似乎总是需要 2039 秒,而查找 another.ip.address.example.com 总是需要 1324 秒。在那之后的第二天,这些地址的查找就很好了。起初我认为 DNS BL 作者在他们这边设置了某种超时。但如果这是核心问题,getaddrinfo 应该早点超时吧?
4

1 回答 1

4

Windows 有一个执行 DNS 缓存的本地守护程序。您对 getaddrinfo() 的调用被路由到该守护程序,该守护程序可能会在将查询提交到您的 DNS 服务器之前检查其缓存。

有关禁用缓存的详细信息,请参阅Windows 知识库文章 318803

[已编辑]

在我看来,您的 Windows Server 2003 实例似乎没有为 IPv6 正确配置。一旦 IPv6 查找超时,它将回退到 IPv4。可能有帮助的知识库文章包括:

不幸的是,我无法访问任何 Windows 服务器,因此我无法自己测试/复制它。

于 2009-11-22T12:36:20.330 回答