【问题标题】:getaddrinfo with AI_NUMERICHOST带有 AI_NUMERICHOST 的 getaddrinfo
【发布时间】:2019-08-11 19:43:07
【问题描述】:

POSIX getaddrinfo() 函数用于执行 DNS 解析以及服务名称解析。传递给getaddrinfo()hints 参数有一个标志字段ai_flags

可能的标志值包括AI_NUMERICHOST。根据the documentation,这通知getaddrinfo()主机名字符串是一个IP地址。由于主机名已经是 IP 地址(而不是主机名),因此不需要 DNS 解析。

我无法理解此标志的用途或用例。如果你已经有了 IP 地址,为什么还要打电话给getaddrinfo()?我能看到的唯一可能目的是您已经拥有 IP 地址,但只想获取服务名称。但是这种情况下,你可以直接调用getservbyname(),这样会简单很多。

我唯一能想到的是getaddrinfo() 是可重入的,而显然getservbyname() 是不可重入的。那么AI_NUMERICHOST 标志的全部目的仅仅是为了提供一种实现线程安全getservbyname() 的迂回方式吗?

如果不是,AI_NUMERICHOST的目的是什么?

【问题讨论】:

    标签: c linux dns posix


    【解决方案1】:

    getaddrinfoAI_NUMERICHOST 的主要用途是作为inet_atoninet_pton 的与IPv4/IPv6 无关的替代品。也就是说,它采用文本 IPv4 IPv6 地址并将它们转换为 sockaddr 对象;调用代码不必知道哪个是哪个。

    您也可以将它用作线程安全的getservbyname,但我不记得上次我看到没有使用AI_NUMERICSERV的代码,所以我不要认为这是重要的属性。

    【讨论】:

    • 啊……很有趣。我曾认为最重要的用途是用于 DNS 解析
    • 嗯,是的,但原理相同 -- getaddrinfo without AI_NUMERICHOST 是 IPv4/v6 中性替代 gethostbyname
    • 请注意,它也优于 inet_pton,因为它可以处理链接本地地址的 IPv6 范围标识符,而调用者无需知道存在这样的事情。
    • @R.. 确实如此,但我认为getaddrinfo 自动检测是否已通过v4 或v6 地址更实用。 inet_pton 可以解析 v6 地址,但你必须告诉它这样做,所以调用者必须自己做一些解析。
    • @zwol:如果有人同时尝试inet_pton 并在出错时重试另一个,我不会感到惊讶...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 2020-10-19
    • 1970-01-01
    • 2012-03-23
    • 2018-02-04
    • 1970-01-01
    相关资源
    最近更新 更多