gethostbyname()有时候不能永远dns

时间:2017-08-24 07:44:16

标签: linux dns embedded-linux glibc

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

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

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

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

程序1:网络正常后无法获取IP(ping即可)

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

程序2:在分叉过程中执行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还是内核的?

任何解释都将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

由于resolv.conf如下: nameserver 192.168.0.1 nameserver 0.0.0.0 nameserver 8.8.8.8

它始终为0.0.0.0以查询DNS ...