首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IPV6套接字连接()返回EADDRNOTAVAIL

IPV6套接字连接()返回EADDRNOTAVAIL
EN

Stack Overflow用户
提问于 2016-06-13 06:04:05
回答 2查看 892关注 0票数 0

我试图通过对Appstore的IPv6支持,并遇到了一些问题。

我遵循苹果的行会支持IPv6 DNS64 64/NAT64 64网络,我的代码:

代码语言:javascript
复制
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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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网络里:

代码语言:javascript
复制
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地址。

票数 0
EN

Stack Overflow用户

发布于 2016-06-13 07:28:17

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

解析器可能仍然会为您提供原始IPv4结果和NAT64的合成IPv6结果。如果您遇到的错误是试图在IPv4 6专用网络上创建IPv4套接字,我不会感到惊讶。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37782751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档