C 使用getaddrinfo()解析FQDN,但不一定是规范名称
各位晚上好 是否可以使用C 使用getaddrinfo()解析FQDN,但不一定是规范名称,c,dns,network-programming,getaddrinfo,gethostbyname,C,Dns,Network Programming,Getaddrinfo,Gethostbyname,各位晚上好 是否可以使用getaddrinfo()/getnameinfo()将非FQDN名称解析为其FQDN版本,但不必以类似于gethostbyname()的方式一直解析到规范名称 为了澄清我的问题,让我试着在下面描述我的使用场景 假设我的公司,example.com,有几个内部部门,具有(半)自治的DNS区域管理,每个部门发布为deptX.example.com,deptY.example.com等 每个部门的计算机都配置有DNS后缀搜索列表,格式如下 搜索deptX.example.co
getaddrinfo()
/getnameinfo()
将非FQDN名称解析为其FQDN版本,但不必以类似于gethostbyname()
的方式一直解析到规范名称
为了澄清我的问题,让我试着在下面描述我的使用场景
example.com
,有几个内部部门,具有(半)自治的DNS区域管理,每个部门发布为deptX.example.com
,deptY.example.com
等内部唯一名称.cloud.example.org
的别名host1.deptX
,依靠DNS后缀搜索列表解析全名host1.deptX.example.com
。(请注意,它在任何地方都有效,而不仅仅是在X部门。)gethostbyname()
是唯一的选项时,我使用一个部分名称,例如“host1.deptX”
,响应中的h_name
字段会给我FQ,但不是规范的DN“host1.deptX.example.com”
,这对我很好
由于gethostbyname()
和gethostbyaddr()
在相当长的一段时间内已被正式淘汰,我认为我应该转向getaddrinfo()
和getnameinfo()
,尤其是在新的实现中
但是,我没有找到与struct hostent
的h_name
字段等价的字段。在我看来,最接近的是struct addrinfo
的ai_canonname
,它只有在我请求解析规范名称时才会被填入ai_canonname
标志。如果我在上面的场景中这样做,结果名称将是internal unique name.cloud.example.org
,这不是我想要的
我是否遗漏了什么,或者可能误用了getaddrinfo()
?有没有办法让这个函数给出我需要的答案
在我看来,这些部分名称从一开始就应该避免。OTOH,现在尝试修复它们是不切实际的(特别是在我自己的部门以外的部门),所以这不是一个真正的选择 我当然能够从
getaddrinfo()
进一步切换到libresolv的res\u query()
及其同级,但我希望避免这样做,原因有很多,包括能够解析本地名称(例如/etc/hosts
),使用本地名称缓存(例如UNIX上的ncsd
)以及在备用目录(如LDAP和NIS)上发布的名称,但DNS中没有这些名称(这是一种罕见但绝对存在的情况)
编辑:我进一步测试,发现我在上面犯了一个错误。我的印象是,struct hostent
的h_name
总是会附加短名称对应的FQDN,但这种行为只会发生在本地数据库中的名称上(/etc/hosts
,在尝试查询DNS之前读取该名称)并且FQDN是该行中的第一个条目。对于常规DNS解析名称,h_name
将用规范名称填充,非规范FQDN仅出现在h_别名
字段指向的列表中
因此,struct-hostent
的h\u-name
实际上相当于struct-addrinfo
的ai\u-canonname
,其行为差异是gethostbyname()
显然总是使其版本指向某些数据,而getaddrinfo()
仅在选项标志明确命令的情况下使用ai_canonname
OTOH,struct addrinfo
没有指向已知别名列表的指针,我可以通过它来检查主机所属的部门
最后,我想我会坚持使用gethostbyname()
一段时间,至少对于当前的工具
search deptX.example.com example.com example.org