苹果官方出了新的规定,要求新上架的app都必须单独支持ipv6-only的网络。html
具体的要求连接:https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW13服务器
热心的网友来了个中文版本的:网络
http://kepenj.me/2016/05/22/Supporting-IPv6/app
全民神魔跟三打白骨精两个项目用的仍是两年前的cocos2dx3.0rc版本,明显各类不支持。并且咱们本身重写了socket,因此须要修改的地方有下面三个:curl
1.curlsocket
开始的时候,本身上curl上了个最新的源码,替换掉旧的,结果不行。测试
而后发现原来还有个libcurl.a的库要替换的。一并替换了,也是不行的。ui
而后就把电脑里的好几个版本都拿去替换,仍是不行。url
最后,实在没办法,跑去cocos2d-x官网看有没有相关历史版本能够尝试使用的。结果看到这个:spa
[3.11.1] 支持IPV6-Only网络 [3.11] Chipmunk升级到v7.0.1 [3.11] JSB使用新的内存模型,在JS脚本不须要关心对象的生命周期,该特性默认关闭 [3.11] CURL升级到v7.48 [3.11] OpenSSL升级到v1.0.2g [3.11] 可使用VSCode或者新版本的Firefox调试JSB程序 [3.11] 全面升级 WebGL 渲染器
也就是官网特意加多个版本,去解决这个IPV6-Only网络的问题。
知道这个就好办了,直接下载最新的引擎。拿里面的关于curl的库跟源码对旧项目进行替换。
a库那里有个问题稍微测试下,旧版本的cocos2dx只有libhcurl.a,而新版本的是有libcurl.a, libssl.a, libcrypto.a,三个都要加进去,并且还要加到项目的引用。
2.host to ip
域名到ip的转换。
咱们的服务器是配置了域名,而后把客户端链接的时候,先进行域名到ip的转换。再用ip去链接服务器。
原来咱们用的是 gethostbyname的方法去获取ipv4的ip。上面发的连接里有提到这个问题,ipv6要用gethostbyname2。
也是作了尝试,实在c语言水平有限,并且也不知道怎么去判断网络是ipv4仍是ipv6的问题。
最后找到了另一个域名转换ip的方法。就是用getaddrinfo,这个方法的好处在于,解决了转换IP,又解决了判断网络。
这个是oc代码。
- (NSString *) getIPWithHostName:(const NSString *)hostName { struct addrinfo * result; struct addrinfo * res; char ipv4[128]; char ipv6[128]; int error; BOOL IS_IPV6 = FALSE; bzero(&ipv4, sizeof(ipv4)); bzero(&ipv4, sizeof(ipv6)); error = getaddrinfo([hostName UTF8String], NULL, NULL, &result); if(error != 0) { NSLog(@"error in getaddrinfo:%d", error); return nil; } for(res = result; res!=NULL; res = res->ai_next) { char hostname[1025] = ""; error = getnameinfo(res->ai_addr, res->ai_addrlen, hostname, 1025, NULL, 0, 0); if(error != 0) { NSLog(@"error in getnameifno: %s", gai_strerror(error)); continue; } else { switch (res->ai_addr->sa_family) { case AF_INET: memcpy(ipv4, hostname, 128); break; case AF_INET6: memcpy(ipv6, hostname, 128); IS_IPV6 = TRUE; default: break; } NSLog(@"hostname: %s ", hostname); } } freeaddrinfo(result); if(IS_IPV6 == TRUE) return [NSString stringWithUTF8String:ipv6]; return [NSString stringWithUTF8String:ipv4]; }
3.socket
ipv6里面,对socket的建立及链接都须要有相关的修改。
感谢这位仁兄提供的解决方法。
http://blog.csdn.net/hepeng597/article/details/7803277
照着上面这个连接的对比方法,对socket进行修改便可。
这里有个小技巧,若是有须要对链接地址进行网络判断的话,能够判断ip地址里是否有冒号 ":"
c语言里能够用这个判断 strchr(server, ':') != NULL