如何升级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; }
- 如何升级cocos2d-x来支持ipv6以及socket怎么支持ipv6
- 如何升级cocos2d-x来支持ipv6以及socket怎么支持ipv6
- socket 支持 ipv6
- Unity IPv6 Socket 支持
- AF如何支持ipv6?
- 升级支持ipv4/ipv6后的Socket处理(cocos2dx项目苹果审核支持ipv6处理二)
- 如何让PJSIP 支持IPV6
- Socket Programming下IPv6的支持
- C++创建支持IPv4/IPv6的Socket
- c#让Socket服务支持IPv6
- 关于 Unity3d iOS 9.x支持ipv6
- IPV4服务器如何支持ipv6访问
- 记录-如何测试服务器是否支持ipv6
- 6月1号后苹果爸爸只爱IPv6 Cocos2d-x更新支持详解
- IPv6 Cocos2d-x
- IPv6 scp 直接支持
- iOS 支持 IPv6
- iOS 支持 IPv6
- 文本字体
- linux中的make命令解释集锦
- 二叉搜索树
- JavaSE 之 ----- Socket 使用
- 你见过哪些怦然心动的美女图片?
- 如何升级cocos2d-x来支持ipv6以及socket怎么支持ipv6
- 【Leetcode】之Combinations
- ACER+EFI+WIN10+UBUNTU宏基笔记本双系统
- python 全排列算法实现
- pandas数据结构基础
- 100个常用的Linux命令
- Material Design之CollapsingToolbarLayout 和 TabLayout使用
- python网络爬虫学习(六)利用Pyspider+Phantomjs爬取淘宝模特图片
- 开发稳定的应用的技巧