| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- //
- // IPV6Support.m
- // WentingPlugins
- //
- // Created by 吴博 on 2021/2/6.
- //
- #include <sys/socket.h>
- #include <netdb.h>
- #include <arpa/inet.h>
- #include <err.h>
- #import <Foundation/Foundation.h>
-
- #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);
- }
|