我正在使用 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 应该早点超时吧?