在我们的一个产品(使用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还是内核的?
任何解释都将不胜感激。
答案 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 ...