蘋果官方出了新的規定,要求新上架的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 端口 測試一下