首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自getaddrinfo的缓慢响应

来自getaddrinfo的缓慢响应
EN

Stack Overflow用户
提问于 2009-11-22 12:17:03
回答 1查看 7K关注 0票数 9

我使用getaddrinfo在Windows上从C++进行DNS查询。我过去经常使用Windows,它工作得很好,但是当我将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应该提前超时吗?
EN

回答 1

Stack Overflow用户

发布于 2009-11-22 12:36:20

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

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

编辑的

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

  • Windows Server 2003 Deployment Guide >>> Configuring DNS for IPv6/IPv4 Coexistence
  • TechNet Library >>> Internet Protocol Version 6
  • TechNet Library >>> Using Windows Tools to Obtain IPv6 Configuration Information

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1778546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档