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

  • 每个部门的计算机都配置有DNS后缀搜索列表,格式如下

    搜索deptX.example.com example.com example.org

  • Department X提供了一项公共服务,名为host1.deptX.example.com,但该名称实际上是
    内部唯一名称.cloud.example.org
    的别名

  • 内部名称(几乎)从未在任何地方被任何客户端发布或知道(当然,除非该客户端关心DNS响应)

  • 在许多(可能是大多数)情况下,管理员将其客户端配置为使用较短的部分名称
    host1.deptX
    ,依靠DNS后缀搜索列表解析全名
    host1.deptX.example.com
    。(请注意,它在任何地方都有效,而不仅仅是在X部门。)

  • 某些管理员(也称为me)必须在汇总列表中唯一地标识所有已发布的服务,并按部门进行分类,将引用同一主机的不同已发布名称(如部分名称和相应的FQDN)折叠到单个条目中

  • 在过去,当
    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