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

来源:互联网 发布:手机充电加速软件 编辑:程序博客网 时间:2024/05/22 17:28

转载: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
 在CODE上查看代码片派生到我的代码片
  1. int tcp_connect(const char* ip, int port)  
  2. {  
  3.   
  4.     char strIP[100];  
  5.     sprintf(strIP,"%s",ip);  
  6.   
  7.     char strPort[100];  
  8.     sprintf(strPort,"%d",port);  
  9.   
  10.     struct addrinfo *ailist, *aip;  
  11.     struct addrinfo hint;  
  12.     struct sockaddr_in *sinp;  
  13.     int sockfd;  
  14.     int err;  
  15.     char seraddr[INET_ADDRSTRLEN];  
  16.     short serport;  
  17.   
  18.     hint.ai_family = 0;  
  19.     hint.ai_socktype = SOCK_STREAM;  
  20.     hint.ai_flags = AI_CANONNAME;  
  21.     hint.ai_protocol = 0;  
  22.     hint.ai_addrlen = 0;  
  23.     hint.ai_addr = NULL;  
  24.     hint.ai_canonname = NULL;  
  25.     hint.ai_next = NULL;  
  26.     if ((err = getaddrinfo(strIP, strPort, &hint, &ailist)) != 0) {  
  27.         printf("getaddrinfo error: %s\n", gai_strerror(err));  
  28.         return -1;  
  29.     }  
  30.     bool isConnectOk = false;  
  31.     printf("getaddrinfo ok\n");  
  32.     for (aip = ailist; aip != NULL; aip = aip->ai_next) {  
  33.   
  34.         sinp = (struct sockaddr_in *)aip->ai_addr;  
  35.         if (inet_ntop(sinp->sin_family, &sinp->sin_addr, seraddr, INET_ADDRSTRLEN) != NULL)  
  36.         {  
  37.             printf("server address is %s\n", seraddr);  
  38.         }  
  39.         serport = ntohs(sinp->sin_port);  
  40.         printf("server port is %d\n", serport);  
  41.         if ((sockfd = socket(aip->ai_family, SOCK_STREAM, 0)) < 0) {  
  42.             printf("create socket failed: %s\n", strerror(errno));  
  43.             isConnectOk = false;  
  44.             continue;  
  45.         }  
  46.         printf("create socket ok\n");  
  47.         if (connect(sockfd, aip->ai_addr, aip->ai_addrlen) < 0) {  
  48.   
  49.             printf("can't connect to %s: %s\n", strIP, strerror(errno));  
  50.             isConnectOk = false;  
  51.             continue;  
  52.         }  
  53.         isConnectOk = true;  
  54.   
  55.         break;  
  56.     }  
  57.     freeaddrinfo(ailist);  
  58.   
  59.     if (isConnectOk) {  
  60.         return sockfd;  
  61.     }  
  62.     return -1;  
  63.       
  64.   
  65. }  
0 0
原创粉丝点击