您的当前位置:首页正文

ios上如何将ipv4转化成ipv6

来源:花图问答

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

    // 首先将以下object-c代码放入项目的.mm文件中(本文以AppController.mm为例)
    + (NSString *) getIPWithHostName:(const NSString *)hostName {
        //[AppController   ];
        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 只会改变其中的域名
        // 
        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;
    },