如果getaddrinfo一旦失败就会失败(即使在网络准备就绪后)

前端之家收集整理的这篇文章主要介绍了如果getaddrinfo一旦失败就会失败(即使在网络准备就绪后)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在编写一个C应用程序,它在启动时运行为systemd service(发行版:Arch Linux),并且应该连接到服务器.由于应用程序在引导时运行,因此最终会发生网络连接尚未建立.这自然导致第一个函数失败,需要一个函数,在我的例子中是getaddrinfo.

所以我认为我只会编写一个循环,重复调用getaddrinfo,直到网络准备好后它才会成功.不幸的是,我发现即使在建立连接后,getaddrinfo也会因名称或服务未知而失败.

我能够通过其主机名ping服务器,但getaddrinfo仍然不会这样做.如果我停止应用程序并再次运行它,一切正常.如果在第一次调用之前已经建立了网络连接,则getaddrinfo也可以正常工作.

显然,如果getaddrinfo失败一次,因为网络没有准备好,它将永远失败.似乎没有意识到现有的连接.使用不推荐使用的gethostbyname时,行为是相同的.

这种行为的原因是什么?有没有办法强制getaddrinfo刷新内部变量(如果存在)或类似可能解释为什么函数仍然认为没有连接?是否有其他功能我应该先调用以检查网络是否准备好了?

我想避免等待一段时间的延迟,期待网络之后连接.我还希望从我的应用程序中检查连接,而不是首先检查bash脚本然后启动应用程序.

最佳答案
您可以通过编译以下测试程序并按照以下说明来理解答案:

#include dio.h>
#include 

在运行此测试程序之前:

>连接到网络.
>将/etc/resolv.conf暂时重命名为/etc/resolv.conf.save.
>使用良好的主机名启动此测试程序.
>测试程序启动后不久,并开始打印错误代码,将/etc/resolv.conf.save重命名为/etc/resolv.conf.
>观察到测试程序仍在报告DNS解析失败.
>但是,如果您按CTRL-C并重新启动它,测试程序现在将报告有效的DNS解析.

断开连接并从网络重新连接时,网络堆栈会相应地重写和更新/etc/resolv.conf. C库中的DNS解析程序需要此配置文件. C库第一次从/etc/resolv.conf读取DNS配置并缓存它.对于每次查找,它都不会检查/etc/resolv.conf的内容是否已更改.

最后:

>你的家庭作业是将对resolv.h中定义的res_init()的调用添加到这个测试程序,阅读相应的手册页,看看会发生什么.那是你的答案.

猜你在找的Linux相关文章