ipv6 解决方案 详细版

9 篇文章 0 订阅
6 篇文章 0 订阅

苹果官方出了新的规定,要求新上架的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  端口 测试一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值