gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:21:21 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com