加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 17:05:46 所属栏目:百科 来源:网络整理
导读:儿童节后苹果只爱IPv6 Cocos2d-x第一时间支持 http://sanwen8.cn/p/17dTB0M.html 这里只说了更新CURL和libwebsocket网络 以下是两种更新方法,小伙伴可以选择自己喜欢的方式: 一、通过download-deps.py更新 1.修改cocos2dx_root/external/config.json 来更

儿童节后苹果只爱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的句柄



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: %sn",gai_strerror(err));
        return -1;
    }
    bool isConnectOk = false;
    printf("getaddrinfo okn");
    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 %sn",seraddr);
        }
        serport = ntohs(sinp->sin_port);
        printf("server port is %dn",serport);
        if ((sockfd = socket(aip->ai_family,SOCK_STREAM,0)) < 0) {
            printf("create socket failed: %sn",strerror(errno));
            isConnectOk = false;
            continue;
        }
        printf("create socket okn");
        if (connect(sockfd,aip->ai_addr,aip->ai_addrlen) < 0) {

            printf("can't connect to %s: %sn",strIP,strerror(errno));
            isConnectOk = false;
            continue;
        }
        isConnectOk = true;

        break;
    }
    freeaddrinfo(ailist);

    if (isConnectOk) {
        return sockfd;
    }
    return -1;
    

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读