1. 程式人生 > >近期ipv6稽核,個人解決方法

近期ipv6稽核,個人解決方法

關於ipv6網路請求機制不在贅述,網上教程挺多,簡單說下我的解決方法。

蘋果的稽核要求是在iOS9以上支援就可以,所以可以不用低版本系統。對於服務端是不需要做其他的配置,而大部分公司使用的阿里雲也確實不支援IPv6。

伺服器不要配置4a記錄,如果配置了4a記錄,伺服器就必須支援IPv6,這個涉及到後端,工作量略大。所以前端轉換IPv6地址訪問伺服器是目前較好方法。只需要把IPv4 IP地址轉換為 IPv6地址 使用NAT64轉換,在訪問伺服器就可以了。下面貼出轉換IP地址方法,僅用在iOS9以上。

NSString * ipv6Addresses = [Class convertIpv6WithIpAddresses:@"192.0.0.1"
];
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <err.h>
+ (NSString *)convertIpv6WithIpAddresses:(NSString *)ipAddresses {
    const char * c_ip = [ipAddresses UTF8String];
    char * ipchar = calloc(ipAddresses.length, sizeof(char));
    strcpy(ipchar, c_ip);

    struct
addrinfo
hints, *res, *res0; int error, s; const char * newChar = "No"; memset(&hints, 0, sizeof(hints)); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_DEFAULT; error = getaddrinfo(ipchar, "http", &hints, &res0); free(ipchar); if
(error) { errx(1, "%s", gai_strerror(error)); /*NOTREACHED*/ } s = -1; static struct sockaddr_in6 * addr6; static struct sockaddr_in * addr; // NSString * NewStr = NULL; char ipbuf[32]; NSString * TempA = NULL; for (res = res0; res; res = res->ai_next) { if (res->ai_family == AF_INET6) { addr6 =( struct sockaddr_in6*)res->ai_addr; newChar = inet_ntop(AF_INET6, &addr6->sin6_addr, ipbuf, sizeof(ipbuf)); TempA = [[NSString alloc] initWithCString:(const char*)newChar encoding:NSASCIIStringEncoding]; // address = TempA; // NSString * TempB = [NSString stringWithUTF8String:"&&ipv6"]; // // NewStr = [TempA stringByAppendingString: TempB]; printf("%s\n", newChar); } else { addr =( struct sockaddr_in*)res->ai_addr; newChar = inet_ntop(AF_INET, &addr->sin_addr, ipbuf, sizeof(ipbuf)); TempA = [[NSString alloc] initWithCString:(const char*)newChar encoding:NSASCIIStringEncoding]; // NSString * TempB = [NSString stringWithUTF8String:"&&ipv4"]; // // NewStr = [TempA stringByAppendingString: TempB]; printf("%s\n", newChar); } break; } freeaddrinfo(res0); return TempA; }