【问题标题】:getaddrinfo():temporary failure in name resolutiongetaddrinfo():名称解析暂时失败
【发布时间】:2012-04-18 00:17:07
【问题描述】:

我正在用 C 编写一个 web-spider 程序。现在我得到一个 url 列表,首先我需要使用函数:getaddrinfo 获取服务器 IP 地址,然后发生了一件可笑的事情:

url的列表中大约有400万个url,前6000个url处理得很好,然后突然后面的url都失败了! getaddrinfo 为每个 url 返回“名称解析中的临时失败”。此外,如果我从第一个“坏”网址重新启动程序,它会再次运行。

我真的很困惑,卡了2天,感觉DNS运行良好,但是一些有限的资源已经用完了,谁能给我一些建议?

【问题讨论】:

  • 当您重新启动查找时,它是否适用于所有其他主机名,还是仅适用于 6000 个?真的是6000吗?每次都是一样的数量(即6000)吗?
  • 每次大约6000个url,但不完全相同

标签: c linux web-crawler


【解决方案1】:

您的 DNS 服务器可能遇到某种速率限制。 与所有网络问题一样,运行 Wireshark:检查失败的 DNS 请求是否真的被发送,如果是,他们会得到什么回复。

【讨论】:

    【解决方案2】:

    你是在调用@987654321@返回的地址信息吗?非常基础,但由于您没有展示您的代码,因此这是首先想到的理论。

    【讨论】:

    • 资源泄漏也不太可能像这样表现出来。
    • 最后,我发现我忘记在一个if 分支中关闭套接字描述符。纠正错误后,我的程序可以正常工作。但我仍然不知道为什么函数socket() 会正确返回而不是发布错误
    【解决方案3】:

    我想知道您的 ISP 是否以您的蜘蛛非常像蠕虫为由杀死了它。

    考虑运行一个本地 DNS 递归器,例如 PowerDNS recursor,它可以提供已经检索到的信息的缓存并且将完全自行执行查找 - 它不会依赖 ISP 提供的 DNS服务器,因此您的 ISP 设备的速率限制不太可能影响您的程序。

    【讨论】:

      猜你喜欢
      • 2019-10-04
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 2021-03-28
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      相关资源
      最近更新 更多