但我找不到我要找的答案。

#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;

最佳答案

在过去,在IPv6成为现实之前,你可以假设主机名可以合理地解析为一个IP地址。
现在情况并非如此,getaddrinfo将同时返回ipv4和ipv6地址,您确实需要同时尝试这两个地址。如果您确信您的用户将在良好的网络上,或者您的用户能够容忍长时间的延迟,那么按顺序尝试“连接”他们就足够了,但是如果您需要在可能断开的网络上快速建立连接,那么实现一个更精细的过程(搜索“快乐的眼球”)可能会证明是非常困难的。

10-08 13:39