美文网首页
ios上如何将ipv4转化成ipv6

ios上如何将ipv4转化成ipv6

作者: 洒一地阳光_217d | 来源:发表于2019-02-25 23:18 被阅读6次

大家都知道,ios游戏开发的,苹果是强制性要支持ipv6。
所以,写了个ipv4如何转化成ipv6:

    // 首先将以下object-c代码放入项目的.mm文件中(本文以AppController.mm为例)
    + (NSString *) getIPWithHostName:(const NSString *)hostName {
        //[AppController  getIPWithHostName:@"ipv6-test.com" ];
        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:
                        NSLog(@"is ipv4:  ");
                        memcpy(ipv4, hostname, 128);
                        break;
                        
                    case AF_INET6:
                        NSLog(@"is ipv6:  ");
                        memcpy(ipv6, hostname, 128);
                        IS_IPV6 = TRUE;
                        
                    default:
                        break;
                        
                }
                NSLog(@"hostname: %s ", hostname);
            }
        }
        
        freeaddrinfo(result);
        
        if(IS_IPV6 == TRUE){
            NSLog(@"ipv6 raw: %s ", ipv6);
            NSString * result = [NSString stringWithUTF8String:ipv6];
            result = [NSString stringWithFormat:@"%@%@%@", @"[", result, @"]"];
            NSLog(@"ipv6 with brackets: %@ ",result);
            return result;
        }
        
        return [NSString stringWithUTF8String:ipv4];
    }

然后再项目中加入以下代码(此处以js为例):

    urlIpv6Adapt: function () {
        // 把一个ipv4的url转化为ipv6的url 只会改变其中的域名
        // 例如从https://statistic.ttigd.cn/data-statistic到https://[2001:2:0:1baa::7619:c3da]/data-statistic
        let domain = url.match(/\/\/[\w.]+/)[0];
        domain = domain.replace("//", "");
        console.log("原iPv4的域名: " + domain);
        let ipv6Domain = this.dnsIpv6Adapt(domain);
        console.log("转化后的ipv6域名:  " + ipv6Domain);

        let len1 = url.indexOf("//");
        let len2 = url.indexOf(":", len1 + 1);
        if (len2 == -1) {
            len2 = url.indexOf("/", len1 + 2);
        }
        let preffix = url.substr(0, len1 + 2);
        let suffix = url.substr(len2, url.length);
        
        let adaptedUrl = preffix + ipv6Domain + suffix;
        console.log("转化后的完整域名: " + adaptedUrl);
    },

    dnsIpv6Adapt: function (dns) {
        // 调用object-c代码
        let ipv6Domain = jsb.reflection.callStaticMethod("AppController", "getIPWithHostName:", dns);
        return ipv6Domain;
    },

相关文章

  • ios上如何将ipv4转化成ipv6

    大家都知道,ios游戏开发的,苹果是强制性要支持ipv6。所以,写了个ipv4如何转化成ipv6: 然后再项目中加...

  • 一文读懂 IPv4 到 IPv6 的过渡技术

    在介绍 IPv4 到 IPv6 过渡技术之前,我们先来简单了解一下 IPv4 和 IPv6。什么是 IPv4?IP...

  • IPv6过渡技术简介

    Internet上用于公网的合法IPv4地址已经分配完毕,因此使用IPv6代替IPv4是大势所趋。但是IPv6是一...

  • 用上下文协议写一个tcp连接

    ipv4 版 ipv6版

  • iOS一图兼容IPV6问题

    一、IPv6协议解读 IPv6是对IPv4地址空间的扩充。 目前用iOS设备连接Wifi、3/4G网络时,设备被分...

  • IPv6学习笔记

    根据图片进行分析,应用层、传输层和网络接口层上,IPv4与IPv6并无区别。可以说从IPv4过渡到IPv6并不需要...

  • iOS ipv4和ipv6

    IPv6的网络下,API 中直接使用 IPv4为什么不通?? 首先IPv6网络下只能访问IPv6站点,IPv4下只...

  • Internet地址结构

    IPv4 & IPv6 表示 IP 地址有两种标准:IP版本4 (IPv4) 和 IP版本6 (IPv6)。所有有...

  • IPv6地址

    前言 常用的IP协议版本有IPv4和IPv6,前面介绍了IPv4地址,本文介绍IPv6地址。IPv6是为了解决32...

  • IPv6

    IPv6是搞网络的不可绕过的一个门槛,如今已经处于IPv4到IPv6的过渡时期,IPv6比IPv4更安全,配置更简...

网友评论

      本文标题:ios上如何将ipv4转化成ipv6

      本文链接:https://www.haomeiwen.com/subject/xstoyqtx.html