最近,我正在开发基于Linux平台(2.6.32)的网络应用程序。
我的情况是设备需要定期将数据发送到服务器。
每次网络代码首先调用函数getaddinfo()时,它将返回服务器IP地址,然后将此值传递给套接字接口或libcurl api。

但是,我发现如果/etc/resolv.conf设置为无效值,例如名称服务器169.254.1.1,则getaddrinfo()将返回错误值(-3)。即使我将/etc/resolv.conf更新为有效值,getaddrinfo()仍会返回错误。

第一次调用后,似乎getaddrinfo()函数不会更新名称服务器的值。

我的解决方案是在一个独立的进程(不是线程)中调用getaddrinfo()。我发现这是解决上述问题的可行方法。

上述问题的根本原因是什么?

最佳答案

看来这是设计使然,如果使用内部解析器,则glibc本身仅读取一次resolv.conf。

我相信您可以运行nscd进行解析/缓存,它将获取resolv.conf的更改。 (如果nscd正在运行,则glibc会自动联系该守护程序,而不是使用其内部解析程序)

但是,您可以通过调用res_init()函数来强制重新读取resolv.conf。

关于linux - 在Linux平台上调用getaddrinfo()函数的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19930037/

10-12 23:58