IPV6Support.mm 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. //
  2. // IPV6Support.m
  3. // WentingPlugins
  4. //
  5. // Created by 吴博 on 2021/2/6.
  6. //
  7. #include <sys/socket.h>
  8. #include <netdb.h>
  9. #include <arpa/inet.h>
  10. #include <err.h>
  11. #import <Foundation/Foundation.h>
  12. #define MakeStringCopy( _x_ ) ( _x_ != NULL && [_x_ isKindOfClass:[NSString class]] ) ? strdup( [_x_ UTF8String] ) : NULL
  13. extern "C" const char* getIPv6(const char *host) {
  14. if( nil == host )
  15. return NULL;
  16. const char *newChar = "No";
  17. struct addrinfo* res;
  18. struct addrinfo hints;
  19. int n;
  20. memset(&hints, 0, sizeof(hints));
  21. hints.ai_flags = AI_DEFAULT;
  22. hints.ai_family = PF_UNSPEC;
  23. hints.ai_socktype = SOCK_STREAM;
  24. if((n=getaddrinfo(host, "http", &hints, &res))!=0) {
  25. printf("getaddrinfo error: %s\n",gai_strerror(n));
  26. return NULL;
  27. }
  28. struct sockaddr_in6* addr6;
  29. struct sockaddr_in* addr;
  30. NSString * mIPaddr = NULL;
  31. char ipbuf[32];
  32. if (nil != res)
  33. {
  34. if (res->ai_family == AF_INET6) {
  35. addr6 =( struct sockaddr_in6*)res->ai_addr;
  36. newChar = inet_ntop(AF_INET6, &addr6->sin6_addr, ipbuf, sizeof(ipbuf));
  37. NSString * TempA = [[NSString alloc] initWithCString:(const char*)newChar encoding:NSASCIIStringEncoding];
  38. NSString * TempB = [NSString stringWithUTF8String:"&&ipv6"];
  39. mIPaddr = [TempA stringByAppendingString: TempB];
  40. }
  41. else {
  42. addr =( struct sockaddr_in*)res->ai_addr;
  43. newChar = inet_ntop(AF_INET, &addr->sin_addr, ipbuf, sizeof(ipbuf));
  44. NSString * TempA = [[NSString alloc] initWithCString:(const char*)newChar encoding:NSASCIIStringEncoding];
  45. NSString * TempB = [NSString stringWithUTF8String:"&&ipv4"];
  46. mIPaddr = [TempA stringByAppendingString: TempB];
  47. }
  48. }
  49. freeaddrinfo(res);
  50. return MakeStringCopy(mIPaddr);
  51. }