带有 systemd 的 getaddrinfo() API

Posted

技术标签:

【中文标题】带有 systemd 的 getaddrinfo() API【英文标题】:getaddrinfo() API with systemd 【发布时间】:2015-04-25 02:13:10 【问题描述】:

我在 systemd 启动的进程下使用 getaddrinfo() API 查询 DNS 时遇到问题。尽管 /etc/resolv.conf 中有名称服务器条目,但查询无法解析。经过几次系统调用跟踪,发现问题是由于systemd解析造成的。看起来,对于由 systemd 启动的进程,getaddrinfo() DNS 查询在独立模式下通过 systemd 路由(即由 shell 产生),查询正常发生。我更改了 /etc/systemd/resolved.conf 以添加我的 DNS 地址并重新启动 systemd-resolved。现在 DNS 查询可以正常工作了。

是否有绕过 systemd 的 getaddrinfo() [例如:将额外的标志传递给提示],并以通常的方式完成工作?

【问题讨论】:

【参考方案1】:

在我看来,真正的getaddrinfo() 调用应该始终使用glibc。

我最好的猜测是,与 systemd 进程启动的假设相关性完全是错误的。在 systemd 系统上,所有普通进程都由 systemd 直接或间接启动。

glibc 执行的网络名称解析不仅由/etc/resolv.conf 驱动,还由/etc/nsswitch.conf 驱动。您可能会在该文件中看到已解决。

【讨论】:

以上是关于带有 systemd 的 getaddrinfo() API的主要内容,如果未能解决你的问题,请参考以下文章

浅谈getaddrinfo函数的超时处理机制

getaddrinfo() 无法解析winsock

socket模块的getaddrinfo方法详解

VC++6.0中getaddrinfo()方法

使用 getaddrinfo 缓存 DNS

getaddrinfo() 连续失败并出现 EAI_AGAIN