【发布时间】:2013-06-29 10:32:15
【问题描述】:
我对域名解析有疑问。我们可以通过getaddrinfo()函数或通过NAPTR查询、SRV记录查询和A/AAAA 记录。 1. 函数使用 getaddrinfo() 是否在内部使用 NAPTR 查询技术? 2. 使用函数 getaddrinfo() 比其他程序有什么好处?
【问题讨论】:
我对域名解析有疑问。我们可以通过getaddrinfo()函数或通过NAPTR查询、SRV记录查询和A/AAAA 记录。 1. 函数使用 getaddrinfo() 是否在内部使用 NAPTR 查询技术? 2. 使用函数 getaddrinfo() 比其他程序有什么好处?
【问题讨论】:
getaddrinfo() 不查询 NAPTR 或 SRV 记录,或者实际上除了 A 和 AAAA 之外的任何类型的记录强>。 getaddrinfo() 是 libc 的主机名解析服务的接口,它被建模为名称和地址之间的简单映射。要了解情况如何,请考虑此解析服务可能会根据其配置文件/etc/nsswitch.conf 咨询/etc/hosts,或者更罕见的是,NIS+、LDAP、关系数据库等。请注意,这些 NSS 后端都不了解 NAPTR 或 SRV 记录。
只有 DNS 实现 NAPTR 和 SRV 记录,如果要查询它们,则必须使用 API 直接查询 DNS(请参阅res_init() 和相关函数,或更有趣的第三方库,如支持非阻塞操作的c-ares)。您不能使用 libc 主机名解析服务来执行此操作。
关于您的第二个问题,使用getaddrinfo() 的优点是(1)它更容易使用,并且(2)您将找到用户可能已插入/etc/hosts 的条目,您将直接查询DNS就错过了。
【讨论】:
getaddrinfo 也会返回 ipv6 地址。您也可以选择提供提示。还有一种变体 getaddrinfo_a - 此 API 以异步方式提供结果。这有时有助于避免程序在某个地方被阻塞。
【讨论】: