苹果官方出了新的规定,要求新上架的app都必须单独支持ipv6-only的网络。
具体的要求链接:https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW13
热心的网友来了个中文版本的:
http://kepenj.me/2016/05/22/Supporting-IPv6/
1:a库那里有个问题稍微测试下,旧版本的cocos2dx只有libhcurl.a,而新版本的是有libcurl.a, libssl.a, libcrypto.a,三个都要加进去,而且还要加到项目的引用。
注意liburl.a的路径
tcpsocket changed:
static bool isIPV6Net(conststd::string domainStr ="www.baidu.com")
{
bool isIPV6Net =false;
structaddrinfo *result =nullptr,*curr;
structsockaddr_in6 dest;
bzero(&dest,sizeof(dest));
dest.sin6_family =AF_INET6;
int ret =getaddrinfo(domainStr.c_str(),nullptr,nullptr,&result);
if (ret ==0)
{
for (curr = result; curr !=nullptr; curr = curr->ai_next)
{
switch (curr->ai_family)
{
caseAF_INET6:
{
isIPV6Net = true;
break;
}
caseAF_INET:
break;
default:
break;
}
}
}
freeaddrinfo(result);
return isIPV6Net;
}
staticstd::string domainToIP(constchar* pDomain)
{
if (isIPV6Net())
{
structaddrinfo hint;
memset(&hint,0x0,sizeof(hint));
hint.ai_family =AF_INET6;
hint.ai_flags =AI_V4MAPPED;
addrinfo* answer =nullptr;
getaddrinfo(pDomain,nullptr, &hint, &answer);
if (answer !=nullptr)
{
char hostname[1025] ="";
getnameinfo(answer->ai_addr,answer->ai_addrlen,hostname,1025,nullptr,0,0);
char ipv6[128] ="";
memcpy(ipv6,hostname,128);
CCLOG("domainToIP addrStr:%s", ipv6);
return ipv6;
}
freeaddrinfo(answer);
}
else
{
structhostent* h =gethostbyname(pDomain);
if( h !=NULL )
{
unsignedchar* p = (unsignedchar *)(h->h_addr_list)[0];
if( p !=NULL )
{
char ip[16] = {0};
sprintf(ip,"%u.%u.%u.%u", p[0], p[1], p[2], p[3]);
return ip;
}
}
}
return"";
}
#if ((CC_TARGET_PLATFORM ==CC_PLATFORM_ANDROID) || (CC_TARGET_PLATFORM ==CC_PLATFORM_IOS) || (CC_TARGET_PLATFORM ==CC_PLATFORM_MAC))
m_isIpv6=isIPV6Net();
if (m_isIpv6) {
CCLOG("[socket] IPV6");
m_socket = ::socket(AF_INET6,SOCK_STREAM,IPPROTO_TCP);
}else{
CCLOG("[socket] IPV4");
m_socket = ::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
}
#else
m_socket = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
#endif
参考:http://blog.csdn.net/u011809009/article/details/51766714
要注意的坑:
开发的时候发现一切换ipv6wifi socket怎么都连不上
后来发现是服务器管理员把端口给墙了
另外 服务端可以租个国外的ipv6服务器
如果发现连不上 请先用telnet 域名/ip 端口 测试一下