【问题标题】:Do I need to iterate over getaddrinfo()?我需要遍历 getaddrinfo() 吗?
【发布时间】:2019-05-13 19:35:04
【问题描述】:

similar questions,但我找不到我正在寻找的答案。

#include <netdb.h>

int getaddrinfo (const char *hostname, 
                 const char *service, 
                 const struct addrinfo *hints, 
                 struct addrinfo **result) ;

Returns: 0 if OK, nonzero on error 

我想知道为什么我们确实需要对result 指向的链表进行迭代,即使我们定义了hints 而不是NULL。我们已经知道IP(主机名)和PORT(服务)。不是吗?

如果需要迭代,您能否简单地通过考虑一个没有完整网络知识的人来举例说明?

例如,我定义hints如下。

struct addrinfo  hints;

        memset(&hints, 0, sizeof hints);
        hints.ai_family = AF_UNSPEC;        /* IPv4 or IPv6 */
        hints.ai_socktype = SOCK_STREAM;    /* TCP */
        hints.ai_flags = 0;
        hints.ai_protocol = 0;

【问题讨论】:

  • AF_UNSPEC 表示您至少可以获得两个结果;一个用于 IPv4,一个用于 IPv6。此外,每个接口可以有多个 IP 地址(多条 A 记录),然后您可以获得更多记录。
  • 如果您对第一个结果感到满意,您可以避免迭代,但您不应忽略在接受之前检查该结果。
  • @jww 对于后一种情况,我们是否假设 hostname 参数是字母名称(例如 google.com)而不是数字 IP 地址?例如,在终端 dig A www.google.com 上产生一个 A 记录,但 yahoo.com 产生 6 个 A 记录。 但是假设我们已经将数字 IP 地址而不是字母顺序(例如 yahoo.com)传递给 getaddr() 函数,它不限制自己的 IP 地址吗? 我仍然不明白为什么要迭代示例案例。或者我们是否需要这个例子的迭代?
  • @snr,如果你已经有了数字地址,那你为什么还要打电话给getaddrinfo?它是一个名称解析接口。
  • @John Bollingerr 先生,这个功能不是同时使用吗?名称和数字。此外,Kerrisk 说这是套接字的当代方法。 ??

标签: c linux sockets getaddrinfo


【解决方案1】:

在过去,在 IPv6 出现之前,您可以假设主机名可以合理地解析为单个 IP 地址。

现在情况并非如此,getaddrinfo 将返回 ipv4 和 ipv6 地址,您确实需要同时尝试这两个地址。如果您确定您的用户将使用良好的网络,或者您的用户可以容忍长时间的延迟,那么按顺序尝试“连接”他们可能就足够了,但是如果您需要在可能损坏的网络上快速建立连接,那么它可能会被证明是必要的实施更精细的流程(搜索“快乐的眼球”)。

【讨论】:

    猜你喜欢
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多