DNS 服务器将主机名解析为 IP 地址。如果我是正确的,程序可以通过调用将主机名解析为 IP 地址,getaddrinfo()
然后调用 DNS 服务器来进行解析。
在SysV init中,是否有一些守护进程将服务名称解析为端口,就像DNS服务器一样?它是通过阅读做到这一点的/etc/services
吗?是否getaddrinfo()
还调用守护进程来执行解析?
我知道inetd
读取 是/etc/services
为了决定监听哪些套接字。但inetd
似乎没有将服务名称解析为端口,不是吗?
谢谢。
答案1
请注意,仅在定义getaddrinfo()
时才调用 DNS 。nsswitch.conf
该files
条目直接从 读取/etc/hosts
。
基本上,“名称服务切换”功能(NSS)看看/etc/nsswitch.conf
然后可能动态加载“libnss”例程。因此,例如,您可能有,这是在 中提到/lib/x86_64-linux-gnu/libnss_files.so.2
时加载的库。files
nsswitch.conf
对于主机,该nsswitch.conf
行可能会显示类似
hosts: files dns
这将告诉名称服务解析器加载“nss_files”库(将在 中查找/etc/hosts
),如果失败,则加载“nss_dns”库。它是那调用 DNS 服务器的库。
对于服务,nsswitch.conf 行可能类似于
services: files ldap
这将加载“nss_files”库(将在 中查找/etc/services
),如果失败,则加载“nss_ldap”库。
有各种不同的后端(文件、db、ldap、nis、compat、dns...),它们决定名称的解析方式。
对于inet
诸如这样的条目
service time
{
...
}
time
在 NSS 映射中查找 的值services
。如果files
使用 innsswitch.conf
那么它会看到一行
time 37/tcp timserver
它告诉inetd
绑定到 TCP 端口 37。