• cocos2dx解决苹果正版ipv6的问题


    苹果官方出了新的规定,要求新上架的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];
        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

  • 相关阅读:
    C#通过正则表达式统计词频的一个方法
    本地服务器远程连接其它数据库
    拼字符串成为时间,和两个计算时间点的中间值
    删除文件夹里的图片,打印删除日志
    行转列SQL语句
    加载出一个有层次的下拉框
    查询结果列传行
    【Java&Python双管齐下复健002】回文数和反转数
    【Java&Python双管齐下复健001】冒泡排序和质数判断
    【LeetCode记录】初级算法:数组之删除排序数组中的重复项
  • 原文地址:https://www.cnblogs.com/yans/p/5558178.html
Copyright © 2020-2023  润新知