有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;
答案 0 :(得分:0)
在过去,IPv6成为一种事物之前,您可以假设可以将主机名合理地解析为单个IP地址。
如今,情况并非如此,getaddrinfo将同时返回ipv4和ipv6地址,您确实需要尝试这两个地址。如果您确定您的用户将处于良好的网络中,或者您的用户可以忍受较长的延迟,那么按顺序尝试“连接”可能就足够了,但是如果您需要在可能断开的网络上快速建立连接,则可能证明实施更精细的过程(搜索“开心的眼球”)。