4

我对域名解析有疑问。我们可以通过使用函数getaddrinfo()或通过NAPTR查询、SRV记录查询和A/AAAA记录的过程来进行从DNS到IP地址格式的地址解析。1. 函数使用 getaddrinfo() 是否在内部使用 NAPTR 查询技术?2. 使用函数 getaddrinfo() 与其他程序相比有什么优势?

4

2 回答 2

8

getaddrinfo()不查询NAPTRSRV记录,或者实际上除了AAAAA之外的任何类型的记录。getaddrinfo()是 libc 的主机名解析服务的接口,它被建模为名称和地址之间的简单映射。要了解情况如何,请考虑此解析服务可能会/etc/hosts根据其配置文件咨询,或者更罕见的是,NIS+、LDAP、关系数据库等/etc/nsswitch.conf。请注意,这些 NSS 后端都不了解NAPTRSRV记录。

只有 DNS 实现了NAPTRSRV记录,如果你想查询它们,你将不得不使用 API 来直接查询 DNS(参见res_init()和相关函数,或者更有趣的第三方库,如支持非阻塞操作的c-ares)。您不能使用 libc 主机名解析服务来执行此操作。

至于你的第二个问题,使用的优点getaddrinfo()是(1)它更容易使用,(2)你会找到用户可能插入的条目,/etc/hosts如果你直接查询 DNS,你会错过。

于 2013-07-02T14:21:04.413 回答
1

getaddrinfo 也会返回 ipv6 地址。您也可以选择提供提示。还有一种变体 getaddrinfo_a - 此 API 以异步方式提供结果。这有时有助于避免程序在一个地方被阻塞。

于 2020-01-23T18:45:35.140 回答