gpt4 book ai didi

c++ - IPV6 套接字 connect() 返回 EADDRNOTAVAIL

转载 作者:行者123 更新时间:2023-11-30 05:26:26 25 4
gpt4 key购买 nike

我正在尝试通过 Appstore 的 IPv6 支持,但遇到了一些问题。

我关注了苹果公会Supporting IPv6 DNS64/NAT64 Networks ,我的代码:

const char sAddr[] = "123.123.123.123"; //my IPv4 gamesvr, using boost asio
const char sPort[] = "9899";
const char *cause = NULL;
int sock_;
struct addrinfo hints, *res, *res0;

memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_DEFAULT;

int error = getaddrinfo(sAddr, sPort, &hints, &res0);
if (error) {
return false;
}
sock_ = -1;
for (res = res0; res; res = res->ai_next) {
sock_ = socket(res->ai_family, res->ai_socktype,res->ai_protocol);
if (sock_ < 0) {
cause = "socket";
continue;
}
if (::connect(sock_, res->ai_addr, res->ai_addrlen) < 0) {
error = errno; // error = 49, EADDRNOTAVAIL
break;
}
break; /* okay we got one */
}
if (sock_ < 0) {
freeaddrinfo(res0);
return false;
}
freeaddrinfo(res0);
return true;

在 IPv4 WIFI 下,我的游戏运行良好。

当切换到 IPv6-ONLY WIFI(由 mac 运行)时,使用 CURL 的功能运行良好,我可以获取网页内容,但 socket connect() 失败,errno 49(EADDRNOTAVAIL),res->ai_family = 30 (AF_INET6)

任何人都请帮助我,非常感谢!

最佳答案

尝试将 error = errno; 之后的 break 更改为 continue。如果 connect 失败,您应该尝试下一个地址。

解析器可能仍会为您提供原始 IPv4 结果 NAT64 的合成 IPv6 结果。如果您收到的错误是由于尝试在纯 IPv6 网络上创建 IPv4 套接字,我不会感到惊讶。

关于c++ - IPV6 套接字 connect() 返回 EADDRNOTAVAIL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37782751/

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