// // IPV6Support.m // WentingPlugins // // Created by 吴博 on 2021/2/6. // #include #include #include #include #import #define MakeStringCopy( _x_ ) ( _x_ != NULL && [_x_ isKindOfClass:[NSString class]] ) ? strdup( [_x_ UTF8String] ) : NULL extern "C" const char* getIPv6(const char *host) { if( nil == host ) return NULL; const char *newChar = "No"; struct addrinfo* res; struct addrinfo hints; int n; memset(&hints, 0, sizeof(hints)); hints.ai_flags = AI_DEFAULT; hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; if((n=getaddrinfo(host, "http", &hints, &res))!=0) { printf("getaddrinfo error: %s\n",gai_strerror(n)); return NULL; } struct sockaddr_in6* addr6; struct sockaddr_in* addr; NSString * mIPaddr = NULL; char ipbuf[32]; if (nil != res) { if (res->ai_family == AF_INET6) { addr6 =( struct sockaddr_in6*)res->ai_addr; newChar = inet_ntop(AF_INET6, &addr6->sin6_addr, ipbuf, sizeof(ipbuf)); NSString * TempA = [[NSString alloc] initWithCString:(const char*)newChar encoding:NSASCIIStringEncoding]; NSString * TempB = [NSString stringWithUTF8String:"&&ipv6"]; mIPaddr = [TempA stringByAppendingString: TempB]; } else { addr =( struct sockaddr_in*)res->ai_addr; newChar = inet_ntop(AF_INET, &addr->sin_addr, ipbuf, sizeof(ipbuf)); NSString * TempA = [[NSString alloc] initWithCString:(const char*)newChar encoding:NSASCIIStringEncoding]; NSString * TempB = [NSString stringWithUTF8String:"&&ipv4"]; mIPaddr = [TempA stringByAppendingString: TempB]; } } freeaddrinfo(res); return MakeStringCopy(mIPaddr); }