【问题标题】:An issue of getaddrinfo() function call on Linux platformLinux平台getaddrinfo()函数调用问题
【发布时间】:2013-11-24 15:39:57
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 根本原因是Linux标准运行时中的整个DNS查找设计和实现仍然很糟糕。它不仅不灵活,而且速度非常慢(如果您运行大量查找)并且浪费大量资源。

标签: linux networking dns kernel getaddrinfo


【解决方案1】:

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

我相信你可以运行nscd 来解析/缓存,它会接收resolv.conf 的变化。 (如果 nscd 正在运行,glibc 会自动联系该守护进程,而不是使用其内部解析器)

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

【讨论】:

  • 谢谢,不。实际上,该设备没有运行 nscd 服务。我的解决方案是在独立进程(不是线程)中调用 getaddrinfo(),看来上述问题可以解决。
  • 如前所述,您也可以调用 res_init() 函数。所以如果例如getaddrinfo() 没有成功,调用 res_init() 并再次尝试 getaddrinfo() 以便获取一个可能新的 resolv.conf。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多