linux - Linux平台上getaddrinfo()函数调用的问题

标签 linux networking dns kernel getaddrinfo

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

但是,我发现如果/etc/resolv.conf 设置为无效值,例如 nameserver 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/

相关文章:

java - 当数据包未从服务器发送时,如何在 UDP 客户端中设置超时?

google-app-engine - 是否可以在 App Engine 站点上使用 https ://yourdomain. com?

java - 检查DNS服务器功能

linux - Bash 在两个时间戳内合并文件(日志文件)

java - 注册。 Linux 中的防火墙

linux - 在 Linux 中的单个命令行中执行三个命令

amazon-web-services - Amazon AWS NAT 网关不工作,EC2 未在 ECS 集群中注册

iphone - 在 iOS 7 中绕过 Apple Captive Network Assistant 登录

Azure CNAME 重定向不起作用

linux - While循环检查JBoss状态是否关闭,给出错误