您的位置:首页 > 移动开发 > Cocos引擎

如何升级cocos2d-x来支持ipv6以及socket怎么支持ipv6

2016-08-01 13:29 429 查看
转载:http://blog.csdn.net/zhengyayuan123/article/details/51690623

留着备用

儿童节后苹果只爱IPv6 Cocos2d-x第一时间支持
http://sanwen8.cn/p/17dTB0M.html

这里只说了更新CURL和libwebsocket网络

以下是两种更新方法,小伙伴可以选择自己喜欢的方式:

一、通过download-deps.py更新

1.修改cocos2dx_root/external/config.json 来更新第三方库

v3.x用户修改version字段为 v3-deps-94

v2.x用户修改version 字段为 v2-deps-7

2.运行 download-deps.py 脚本更新第三方库

二、通过github页面下载

v3-deps-94:
https://github.com/cocos2d/cocos2d-x-3rd-party-libs-bin/releases/tag/v3-deps-94
v2-deps-7:
https://github.com/cocos2d/cocos2d-x-3rd-party-libs-bin/releases/tag/v2-deps-6
对于Cocos2d-x v2.x的用户,同时还需要修改WebSocket.h和WebSocket.cpp这两个文件以适应新的libwebsocket库,具体参考如下:
https://github.com/cocos2d/cocos2d-x/pull/15666
最后还要告诉大家一个好消息:Cocos2d-x 3.11.1以后的版本将自动支持IPv6,小伙伴们无需升级哦。

那么如果游戏中用的是原生socket该怎么办呢,

值得庆幸的是socket本身是支持ipv6的,网上有方法说将对应的ipv4的改为ipv6的接口如(sockaddr_in 改为sockaddr_in6)等等,方法很多这里不列举了

可我用的不是这种,我是通过域名的方式去做,不管你ipv4还是ipv6都是完美支持的

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

服务器不用做任何修改

废话少说贴代码要紧

下面代码传入ip或者域名,端口

返回socket的句柄

[cpp] view
plain copy

 





int tcp_connect(const char* ip, int port)  

{  

  

    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 sockfd;  

    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) {  

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

        return -1;  

    }  

    bool isConnectOk = false;  

    printf("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)  

        {  

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

        }  

        serport = ntohs(sinp->sin_port);  

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

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

            printf("create socket failed: %s\n", strerror(errno));  

            isConnectOk = false;  

            continue;  

        }  

        printf("create socket ok\n");  

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

  

            printf("can't connect to %s: %s\n", strIP, strerror(errno));  

            isConnectOk = false;  

            continue;  

        }  

        isConnectOk = true;  

  

        break;  

    }  

    freeaddrinfo(ailist);  

  

    if (isConnectOk) {  

        return sockfd;  

    }  

    return -1;  

      

  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐