我对域名解析有疑问。我们可以通过使用函数 getaddrinfo()或通过NAPTR查询,SRV记录查询和程序来解决从DNS到IP地址格式的解析。 A / AAAA记录。 1.函数是否使用getaddrinfo()在内部使用NAPTR查询技术? 2.使用函数getaddrinfo()优于其他过程有什么好处?
答案 0 :(得分:7)
getaddrinfo()
不会查询 NAPTR 或 SRV 记录,或者除 A 和 AAAA之外的任何类型的记录即可。 getaddrinfo()
是libc主机名解析服务的接口,它被建模为名称和地址之间的简单映射。要了解具体情况,请考虑此解析服务可以根据其配置文件/etc/hosts
查询/etc/nsswitch.conf
,或者更少见NIS +,LDAP,关系数据库等。请注意,这些NSS后端中没有一个能够理解 NAPTR 或 SRV 记录。
只有DNS实施 NAPTR 和 SRV 记录,如果您想查询它们,则必须使用API直接查询DNS(请参阅{{1}和相关的函数,或者更有趣的第三方库,如c-ares,支持非阻塞操作)。您无法使用libc主机名解析服务来执行此操作。
关于你的第二个问题,使用res_init()
的好处是(1)它更容易使用,(2)你会找到用户可能已插入getaddrinfo()
的条目,如果直接查询DNS,你会错过。
答案 1 :(得分:0)
getaddrinfo也会返回ipv6地址。您也可以选择提供提示。 getaddrinfo_a还有另一种变体-此API以异步方式提供结果。有时这对于避免程序在一个地方被阻塞很有用。