gpt4 book ai didi

c - 是否有必要尝试连接到 getaddrinfo() 返回的所有地址?

转载 作者:太空狗 更新时间:2023-10-29 16:47:09 25 4
gpt4 key购买 nike

Beej's Simple Client示例代码遍历从 getaddrinfo() 返回的所有 IP 地址,直到它可以连接到第一个地址。请参阅下面的代码。

这是否总是必要的,或者假设我们只需要尝试连接到 getaddrinfo() 返回的第一个地址就可以了吗?

memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;

if ((rv = getaddrinfo(argv[1], PORT, &hints, &servinfo)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
return 1;
}

// ------------------------------------------------------------
// loop through all the results and connect to the first we can
for(p = servinfo; p != NULL; p = p->ai_next) {
if ((sockfd = socket(p->ai_family, p->ai_socktype,
p->ai_protocol)) == -1) {
perror("client: socket");
continue;
}

if (connect(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
close(sockfd);
perror("client: connect");
continue;
}

break;
}

最佳答案

是的,您应该遍历所有地址 - 特别是考虑目标主机启用了 IPv6 地址但您的本地主机没有启用的情况。 getaddrinfo() 将返回 AF_INET6 系列地址,但随后 socket()connect() 调用将失败。

也有可能您的主机支持多个实现 SOCK_STREAM 的协议(protocol)(例如,除了 TCP 之外还有 SCTP)而目标主机不支持 - 因为您没有设置 ai_protocol hints 结构的成员,代表所有支持 SOCK_STREAM 套接字的协议(protocol)的地址将被返回。

关于c - 是否有必要尝试连接到 getaddrinfo() 返回的所有地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11572843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com