我是否需要遍历getaddrinfo()?

时间:2019-05-13 19:35:04

标签: c linux sockets getaddrinfo

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;

1 个答案:

答案 0 :(得分:0)

在过去,IPv6成为一种事物之前,您可以假设可以将主机名合理地解析为单个IP地址。

如今,情况并非如此,getaddrinfo将同时返回ipv4和ipv6地址,您确实需要尝试这两个地址。如果您确定您的用户将处于良好的网络中,或者您的用户可以忍受较长的延迟,那么按顺序尝试“连接”可能就足够了,但是如果您需要在可能断开的网络上快速建立连接,则可能证明实施更精细的过程(搜索“开心的眼球”)。