ipv6 解決方案 詳細版

bloodsuckerccj發表於2016-10-14

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

相關文章