大家都知道,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;
},