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

来源:互联网 发布:linux杀死进程命令 编辑:程序博客网 时间:2024/05/22 13:53

儿童节后苹果只爱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: %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;    }

-------------------------------------------------------------------------

2016-11-15 更新

既然有人问 connect_nonb,那边下面是对应的 connect_nonb 代码


int connect_nonb(int sockfd, const struct sockaddr *saptr, socklen_t salen, int nsec){    int flags, n, error;    socklen_t   len;    fd_set  rset, wset;    struct timeval  tval;    flags = fcntl(sockfd, F_GETFL, 0);    fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);    error = 0;    if ((n = connect(sockfd, (struct sockaddr *) saptr, salen)) < 0) {        if (errno != EINPROGRESS) {            goto done;        }    }    /* Do whatever we want while the connect is taking place. */    if (n == 0)        goto done;    /* connect completed immediately */    FD_ZERO(&rset);    FD_SET(sockfd, &rset);    wset = rset;    tval.tv_sec = nsec;    tval.tv_usec = 0;    if ( (n = select(sockfd+1, &rset, &wset, NULL,                     nsec ? &tval : NULL)) == 0) {        close(sockfd);        /* timeout */        errno = ETIMEDOUT;        goto done;    }    if (FD_ISSET(sockfd, &rset) || FD_ISSET(sockfd, &wset)) {        len = sizeof(error);        if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {            goto done;            /* Solaris pending error */        }    } else        cout << "Unable to do select because of " << strerror(errno) << endl;done:    fcntl(sockfd, F_SETFL, flags);    /* restore file status flags */    if (error) {        close(sockfd);        /* just in case */        errno = error;        return(-1);    }    return(0);}



int tcp_connect(const char*ip, int port, int sec){    int ret;    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 (aip->ai_addr->sa_family == AF_INET) {            ret = connect_nonb(sockfd, aip->ai_addr, sizeof(struct sockaddr_in), sec);        }else if(aip->ai_addr->sa_family == AF_INET6){            ret = connect_nonb(sockfd, aip->ai_addr, sizeof(struct sockaddr_in6), sec);        }        //        if (connect(sockfd, aip->ai_addr, aip->ai_addrlen) < 0) {        if(ret < 0){            printf("can't connect to %s: %s\n", strIP, strerror(errno));            isConnectOk = false;            continue;        }        isConnectOk = true;        //        return sockfd;        break;    }    freeaddrinfo(ailist);    if (isConnectOk) {        return sockfd;    }    return -1;    }






2 0
原创粉丝点击