getaddrinfo函数返回No such file or directory的分析

岁酱吖の 提交于 2019-12-05 07:09:18

在项目中实现NTP功能模块时,为了更好的兼容和更小的警告,将gethostbyname函数用getaddrinfo函数进行了替代,可是在开发板上运行时却遇到了这个错误:

getaddrinfo fail for host time.windows.com:System error
error:No such file or directory
然而同样的代码程序在PC上运行是正确的。可以确定是开发板上的文件系统环境缺少某个与网络相关的配置文件导致getaddrinfo系统调用执行失败,问题在于是哪一个文件,怎么来找到它?答案是使用strace工具在追踪getaddrinfo在PC上执行是的文件访问记录,从而找出缺少的配置文件。

为了减少干扰,使用一个简单的test程序来进行分析,使用如下命令得到追踪记录:

# strace -e trace=file -o 2.strace ./test_getaddrinfo
追踪记录文件信息如下(为了保持strace文件的语法高亮,这里使用图片):

滤掉程序执行涉及的动态库链接缓存之类的文件(因为程序运行起来了),就只剩下三个文件了:/etc/host.conf  /etc/hosts  /etc/resolv.conf.

/etc/resolv.conf文件是域名解析服务器列表的参数文件,实现域名解析,必须设置域名服务器的地址,开发板上已经配置了。

/etc/hosts 文件是主机地址列表参数文件,指定本机的ip地址和主机名称,是域名解析的优先参考映射,即先查看该文件,然后才查询DNS,开发板上不存在该文件。

于是添加该文件到开发板上,通过以下命令:

# echo "127.0.0.1 localhost" > /etc/hosts
然后再次运行程序,getaddrinfo解析域名成功,不再返回System Error的错误。

为了保证getaddrinfo之类接口的正确运行,可以采用两者途径来确保配置环境的OK:

1. 在制作设备的根文件系统时,保证上述配置文件的存在及正确。

2. 在应用程序中检测,如果不存在就创建配置文件。我在NTP的实现中就采用了这一个方法:

if(access("/etc/hosts",F_OK))
    {// create the file for getaddrinfo api
        system("echo \"127.0.0.1   localhost\" > /etc/hosts");
    }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!