linux - gethostbyname() 有时无法永远 dns

标签 linux dns embedded-linux glibc

在我们的一个产品(使用RTL8196e芯片的嵌入式平台)中,有时在程序重新启动之前程序永远无法DNS。

更多调查发现,如果程序在网络准备就绪之前启动(例如:在 udhcpc 启用 DHCP 之前),后续对 gethostbyname() 的调用将永远失败,即使在网络正常时 ping 工作时也是如此。

已经做了一些测试来说明:(以最简单的形式,例如:省略打印gethostbyname的结果)

程序在网络准备就绪之前启动(例如:在 eth0 通过 DHCP 获取 IP 之前)

程序一:网络正常后一直获取不到IP(ping正常)

while (1) {
  res_init();
  gethostbyname(...); //not work
  sleep(5);
}

程序 2:在 fork 进程中执行 gethostbyname() 工作

while (1) {
  pid = fork();
  ...
  if (pid == 0)
     res_init();
     gethostbyname(...); //works
  else
     waitpid(pid1,...);
  sleep(5);
}

程序3:子/父进程gethostbyname()执行均失败

while (1) {
  pid = fork();
  ...
  if (pid == 0)
     res_init();
     gethostbyname(...); //not work
  else
     res_init();
     gethostbyname(...); //not work
     waitpid(pid1,...);
  sleep(5);
}

我完全不知道这种奇怪行为的原因是什么......是关于 glic 还是内核?

如有任何解释,我们将不胜感激。

最佳答案

好的,最后我深入到 ulibc 代码并找到了问题。

libc/inet/resolv.c __dns_lookup() 中存在错误。

在某些情况下,变量 local_ns 不会增加以选择下一个 dns 服务器。

因此调用 gethostbyname() 的进程将永远使用一个虚假的 DNS 服务器 IP。

由于resolv.conf如下: 域名服务器 192.168.0.1 名称服务器 0.0.0.0 名称服务器 8.8.8.8

查询 DNS 总是死锁到 0.0.0.0...

关于linux - gethostbyname() 有时无法永远 dns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45855752/

相关文章:

powershell - 如何从 Azure 门户将域委托(delegate)给 Azure DNS?

macos - 如何在 Safari 中禁用 DNS 缓存?

arm - ARM 系统模式与 arm 监控模式有何不同?

linux - Linux 程序中的偏移指令

c - 我对内存分配和页面大小的理解正确吗?

linux - VMWare 上的 Genymotion

php - 守护一个 PHP 脚本,并提供终止它的选项

c# - Asp.net Core Websocket 与 linux/docker 兼容吗?

macos - Mac OS X 中的虚拟网络接口(interface)

linux - sed 在不同的平台上返回不同的结果