在我们的一个产品(使用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/