我试图通过对Appstore的IPv6支持,并遇到了一些问题。
我遵循苹果的行会支持IPv6 DNS64 64/NAT64 64网络,我的代码:
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 6的WIFI (由mac运行)时,使用CURL的函数运行良好,我可以获得web内容,但是套接字连接()失败了,因为errno 49(EADDRNOTAVAIL),res->ai_AF_INET6= 30
请任何人帮助我,非常感谢!
发布于 2016-06-13 11:50:59
我解决了,虽然我不知道为什么..。
令人惊讶的是,当我尝试使用域名而不是数字ip地址时,连接是可以的!
const char sAddr[] = "123.123.123.123";-> const char sAddr[] = "gs1.mydomain.com";
我的游戏运行在IPv6 6下,只有WIFI!
现在我很困惑为什么苹果会把这些放在支持IPv6 DNS64 64/NAT64 64网络里:
uint8_t ipv4[4] = {192, 0, 2, 1};
struct addrinfo hints, *res, *res0;
int error, s;
const char *cause = NULL;
char ipv4_str_buf[INET_ADDRSTRLEN] = { 0 };
const char *ipv4_str = inet_ntop(AF_INET, &ipv4, ipv4_str_buf, sizeof(ipv4_str_buf));
memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_DEFAULT;
error = getaddrinfo(ipv4_str, "http", &hints, &res0);清单10-1显示了如何使用getaddrinfo解析IPv4文本。假设内存中存储了一个IPv4地址为4个字节(例如{192、0、2、1}),此示例代码将其转换为字符串(例如"192.0.2.1"),使用getaddrinfo合成IPv6地址(例如包含IPv6地址“64:ff9b::192.0.2.1”的结构sockaddr_in6 ),并尝试连接到该IPv6地址。
发布于 2016-06-13 07:28:17
尝试在error = errno;之后将error = errno;更改为continue。如果connect失败,您应该尝试下一个地址。
解析器可能仍然会为您提供原始IPv4结果和NAT64的合成IPv6结果。如果您遇到的错误是试图在IPv4 6专用网络上创建IPv4套接字,我不会感到惊讶。
https://stackoverflow.com/questions/37782751
复制相似问题