关于升级cocos2d-x网络库来支持ipv6、https,以及socket怎么支持ipv6

 

注:以下说明均是基于Cocos2d-x v2.x引擎下

 

1.支持https

1.首先跳过服务端、及后台,因为使用的https地址 有SSL证书,所以使用cocos的前端只要网络库支持就够了,先升级完cocos引擎对应网络库.链接如下,自行参考。

http://discuss.cocos2d-x.org/t/supporting-ipv6-only-networks/29266/11

https://github.com/cocos2d/cocos2d-x/pull/15666/commits/43dd696750014efa9b0419a59f72ba1c4cdaba50 

2.修改socket content函数

客户端通过getaddrinfo解析域名,记得freeaddrinfo释放空间

bool CCSocket::connect(const char* ip, unsigned short port)

{

 

    if (isConnent) {

        return true;

    }

    

    char strIP[100];

    sprintf(strIP,"%s",ip);

    char strPort[100];

    sprintf(strPort,"%d",port);

    struct addrinfo *ailist, *aip;

    struct addrinfo hint;

    struct sockaddr_in *sinp;

    int err;

    char seraddr[INET_ADDRSTRLEN];

    short serport;

    

    hint.ai_family = 0;

    hint.ai_socktype = SOCK_STREAM;

    hint.ai_flags = AI_CANONNAME;

    hint.ai_protocol = 0;

    hint.ai_addrlen = 0;

    hint.ai_addr = NULL;

    hint.ai_canonname = NULL;

    hint.ai_next = NULL;

    if ((err = getaddrinfo(strIP, strPort, &hint, &ailist)) != 0) {

        CCLOG("getaddrinfo error: %s\n", gai_strerror(err));

        return -1;

    }

   

    CCLOG("getaddrinfo ok\n");

    for (aip = ailist; aip != NULL; aip = aip->ai_next) {

        

        sinp = (struct sockaddr_in *)aip->ai_addr;

        if (inet_ntop(sinp->sin_family, &sinp->sin_addr, seraddr, INET_ADDRSTRLEN) != NULL)

        {

            CCLOG("server address is %s\n", seraddr);

        }

        serport = ntohs(sinp->sin_port);

        CCLOG("server port is %d\n", serport);

        if ((sock = socket(aip->ai_family, SOCK_STREAM, 0)) < 0) {

        

            CCLOG("failed to create socket\n");

            return false;

        }

        printf("create socket ok\n");

        if (::connect(sock, aip->ai_addr, aip->ai_addrlen) < 0) {

            CCLOG("failed to connect\n");

            ::close(sock);

            return false;

        }

        break;

    }

    freeaddrinfo(ailist);

    isConnent = true;

    CCDirector::sharedDirector()->getScheduler()->scheduleSelector(schedule_selector(CCSocket::update), this, 0, false);

    

    return true;

    

}

 

3。搭建测试环境

 

参考链接https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1

不过注意 share you connection form  选择是 以太网

 

生成NAT64网络测试自己的app。

posted @ 2018-01-24 20:40  小鱼2015  阅读(942)  评论(0编辑  收藏  举报