问题现象:
- 设备挂测/重启,偶现程序请求DNS到127.0.0.1,无法拿到域名对应的IP地址,平台无法连接。
- 但是Linux下的网络功能是正常的,可以正常的ping通服务器,拿到域名对应的IP地址。
问题定位:
- 通过查阅uclibc的源码,gethostaddr的具体实现,发现存在如下的逻辑:
- 每次调用DNS相关的参数,都会去读取文件/etc/resolv.conf文件,如果这个文件的修改时间和上次访问的时间一致,则不再更新,如果不一致,晚于之前记录的时间,则进行更新代码中全局变量存储的值。
- 基于此推测,可能由于多线程冲突,在他读取的时候,另外一个线程恰巧清空了整个文件,然后他读到空,就会去127.0.0.1 DNS请求。同时,清空文件的线程和读取文件的线程几乎是同一时间,导致代码后续再次调用获取域名IP的时候,不会再去更新全局配置中的DNS服务器地址。
问题解决:
- 在出现DNS获取失败的时候,调用函数:utime(“/tmp/resolv.conf”, NULL);
- 即可更新该文件的修改、访问时间,那uclibc就可以重新读取该文件的配置,正常的请求DNS了
5938

被折叠的 条评论
为什么被折叠?



