Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux平台上getaddrinfo()函数调用的一个问题_Linux_Networking_Dns_Kernel_Getaddrinfo - Fatal编程技术网

Linux平台上getaddrinfo()函数调用的一个问题

Linux平台上getaddrinfo()函数调用的一个问题,linux,networking,dns,kernel,getaddrinfo,Linux,Networking,Dns,Kernel,Getaddrinfo,最近,我正在开发基于Linux平台(2.6.32)的网络应用程序。 我的设想是,设备需要定期向服务器发送数据。 每次网络代码首先调用函数getaddinfo(),它都会返回服务器IP地址,然后我将该值传递给socket接口或libcurl api 但是,我发现如果/etc/resolv.conf被设置为无效值,例如nameserver 169.254.1.1,getaddrinfo()将返回一个错误值(-3)。即使我将/etc/resolv.conf更新为有效值,getaddrinfo()仍会返

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

但是,我发现如果/etc/resolv.conf被设置为无效值,例如nameserver 169.254.1.1,getaddrinfo()将返回一个错误值(-3)。即使我将/etc/resolv.conf更新为有效值,getaddrinfo()仍会返回错误

在第一次调用之后,getaddrinfo()函数似乎不会更新nameserver值

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


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

这似乎是出于设计,glibc本身只读取resolv.conf一次-如果使用内部解析器

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


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

谢谢,没有。实际上,设备没有;我没有运行nscd服务。我的解决方案是在独立进程(不是线程)中调用getaddrinfo(),似乎上面的问题可以解决。如前所述,您也可以调用res_init()函数。因此,如果例如getaddrinfo()没有成功,请调用res_init()并再次尝试getaddrinfo(),以便找到一个可能的新resolv.conf。根本原因是Linux标准运行时中的整个DNS查找设计和实现仍然很糟糕。它不仅不灵活,而且速度非常慢(如果您运行大量查找),并且浪费大量资源。