iOS中关于苹果审核IPv6的问题( 三 )


4.2 本机IP获取支持IPV6
相当于我们在终端中输入命令获取字符串,然后对结果字符串进行解析,获取其中en0(Wifi)、(移动网络)的ip地址 。
注意:
(1)在模拟器和真机上都会出现以FE80开头的IPV6单播地址影响我们判断,所以在这里进行特殊的处理(当第一次遇到不是单播地址的IP地址即为本机IP地址) 。
(2)在IPV6环境下,真机测试的时候,第一个出现的是一个IPV4地址,所以在IPV4条件下第一次遇到单播地址不退出 。
+ (NSString *)deviceIPAdress{while (temp_addr != NULL) {NSLog(@"ifa_name===%@",[NSString stringWithUTF8String:temp_addr->ifa_name]);// Check if interface is en0 which is the wifi connection on the iPhoneif ([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"] || [[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"pdp_ip0"]){//如果是IPV4地址,直接转化if (temp_addr->ifa_addr->sa_family == AF_INET){// Get NSString from C Stringaddress = [self formatIPV4Address:((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr];}//如果是IPV6地址else if (temp_addr->ifa_addr->sa_family == AF_INET6){address = [self formatIPV6Address:((struct sockaddr_in6 *)temp_addr->ifa_addr)->sin6_addr];if (address && ![address isEqualToString:@""] && ![address.uppercaseString hasPrefix:@"FE80"]) break;}}temp_addr = temp_addr->ifa_next;}}}
4.3 设备网关地址获取获取支持IPV6
其实是在IPV4获取网关地址的源码的基础上进行了修改,初开把->,-> 之外,还需要注意如下修改,就是拷贝的地址字节数 。去掉了的处理 。(解析出来的地址老是少了4个字节,结果是偏移量搞错了,纠结了半天),具体参考源码库 。
/* net.route.0.inet.flags.gateway */int mib[] = {CTL_NET, PF_ROUTE, 0, AF_INET6, NET_RT_FLAGS, RTF_GATEWAY};if (sysctl(mib, sizeof(mib) / sizeof(int), buf, &l, 0, 0) < 0) {address = @"192.168.0.1";}....//for IPV4for (i = 0; i < RTAX_MAX; i++) {if (rt->rtm_addrs & (1 << i)) {sa_tab[i] = sa;sa = (struct sockaddr *)((char *)sa + ROUNDUP(sa->sa_len));} else {sa_tab[i] = NULL;}}//for IPV6for (i = 0; i < RTAX_MAX; i++) {if (rt->rtm_addrs & (1 << i)) {sa_tab[i] = sa;sa = (struct sockaddr_in6 *)((char *)sa + sa->sin6_len);} else {sa_tab[i] = NULL;}}
4.4 设备DNS地址获取支持IPV6
IPV4时只需要通过进行初始化就可以获取,但是在IPV6环境下需要通过()接口才能获取 。
+(NSArray *)outPutDNSServers{res_state res = malloc(sizeof(struct __res_state));int result = res_ninit(res);NSMutableArray *servers = [[NSMutableArray alloc] init];if (result == 0) {union res_9_sockaddr_union *addr_union = malloc(res->nscount * sizeof(union res_9_sockaddr_union));res_getservers(res, addr_union, res->nscount);for (int i = 0; i < res->nscount; i++) {if (addr_union[i].sin.sin_family == AF_INET) {char ip[INET_ADDRSTRLEN];inet_ntop(AF_INET, &(addr_union[i].sin.sin_addr), ip, INET_ADDRSTRLEN);NSString *dnsIP = [NSString stringWithUTF8String:ip];[servers addObject:dnsIP];NSLog(@"IPv4 DNS IP: %@", dnsIP);} else if (addr_union[i].sin6.sin6_family == AF_INET6) {char ip[INET6_ADDRSTRLEN];inet_ntop(AF_INET6, &(addr_union[i].sin6.sin6_addr), ip, INET6_ADDRSTRLEN);NSString *dnsIP = [NSString stringWithUTF8String:ip];[servers addObject:dnsIP];NSLog(@"IPv6 DNS IP: %@", dnsIP);} else {NSLog(@"Undefined family.");}}}res_nclose(res);free(res);return [NSArray arrayWithArray:servers];}
4.4 域名DNS地址获取支持IPV6
在IPV4网络下我们通过获取,而在IPV6环境下,通过新的函数获取 。
//ipv4phot = gethostbyname(hostN);//ipv6phot = gethostbyname2(hostN, AF_INET6);