cocos2dx解决苹果正版ipv6的问题

摘要:
苹果官方出了新的规定,要求新上架的app都必须单独支持ipv6-only的网络。最后,实在没办法,跑去cocos2d-x官网看有没有相关历史版本可以尝试使用的。a库那里有个问题稍微测试下,旧版本的cocos2dx只有libhcurl.a,而新版本的是有libcurl.a,libssl.a,libcrypto.a,三个都要加进去,而且还要加到项目的引用。也是做了尝试,实在c语言水平有限,而且也不知道怎么去判断网络是ipv4还是ipv6的问题。=0){NSLog;continue;}else{switch{caseAF_INET:memcpy;break;caseAF_INET6:memcpy;IS_IPV6=TRUE;default:break;}NSLog;}}freeaddrinfo;ifreturn[NSStringstringWithUTF8String:ipv6];return[NSStringstringWithUTF8String:ipv4];}3.socketipv6里面,对socket的创建及连接都需要有相关的修改。

苹果官方出了新的规定,要求新上架的app都必须单独支持ipv6-only的网络。

具体的要求链接: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/

全民神魔跟三打白骨精两个项目用的还是两年前的cocos2dx3.0rc版本,明显各种不支持。而且我们自己重写了socket,所以需要修改的地方有下面三个:

1.curl

开始的时候,自己上curl上了个最新的源码,替换掉旧的,结果不行。

然后发现原来还有个libcurl.a的库要替换的。一并替换了,也是不行的。

然后就把电脑里的好几个版本都拿去替换,还是不行。

最后,实在没办法,跑去cocos2d-x官网看有没有相关历史版本可以尝试使用的。结果看到这个:

[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];
    interror;
    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);
        returnnil;
    }
    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) {
                caseAF_INET:
                    memcpy(ipv4, hostname, 128);
                    break;
                caseAF_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

免责声明:文章转载自《cocos2dx解决苹果正版ipv6的问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇IOS APP配置.plist汇总(转自coolweather ) 沧海一粟python中函数 reshape(-1,1)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

服务端CURL请求

服务端与服务端之间,也存在接口编程。 比如我们网站服务端,需要发送短信、发送邮件、查询快递等,都需要调用第三方平台的接口。 1、php中发送请求 ①file_get_contents函数 :传递完整的url参数 通常是get请求,有返回值(地址中的输出) ②curl请求方式(PHP的curl函数库):php中比较规范的一种发送请求方式。 2、CURL函数...

接口中转stream传输 request/response

php实现 CURLOPT_WRITEFUNCTION: for response ,把接口返回的结果拿回来,会进行多次回调,直到接口中的内容全部读完CURLOPT_READFUNCTION :for request ,把要请求接口的参数数据写出去 CURLOPT_READFUNCTION 回调函数名。该函数应接受三个参数。第一个是 cU...

deppin Linux下安装docker

首先楼主用的是deppin15.11   docker 简介:Docker作为一个软件集装箱化平台,可以让开发者构建应用程序时,将它与其依赖环境一起打包到一个容器中,然后很容易地发布和应用到任意平台中。         思想:              1.集装箱             2.标准化             3.隔离           核...

Elastic search 基本使用

1. elasticsearch 命令的基本格式 RESTful接口URL的格式: http://localhost:9200/<index>/<type>/[<id>] 其中index、type是必须提供的。id是可选的,不提供es会自动生成。index、type将信息进行分层,利于管理。index可以理解为数据库;t...

php MP3文件下载功能的实现

方式一:生成文件,返回一个链接,window.href =链接; 方式二:hearder输出文件流。 先设置流的Content-Type和web服务器的mime类型。 mime类型参考 一个header文件流下载mp3文件的实例, 服务器端:functiondownload(){ $full_path = 'pro/mp3/demo.mp3'; $f...

嵌入式 Linux下编译并使用curl静态库

#x86./configure --disable-shared --enable-static --disable-ftp --disable-ipv6 --disable-rtsp --disable-tftp --disable-telnet --disable-largefile --disable-smtp --disable-imap --wi...