2017-10-12 12 views
0

pjsipベースのiOS SDKをIPv6でアップデートする予定です。私たちはIPv6環境を開発しました。 Device IPがIPv6以外のIPv4(ipv4.url.com)に属している場合は、IPv6サーバ(ipv6.url.com)を呼び出す予定です。ですから、iOS SDKからIPv4とIPv6を区別する方法はありますか?iOSでipv4とipv6を区別する方法は?

答えて

1

、最初

#include <ifaddrs.h>

#include <sys/socket.h>

#include <arpa/inet.h>

- (BOOL)ifIPv6Address 
{ 
    struct ifaddrs *ifa, *ifa_tmp; 
    char addr[50]; 

    if (getifaddrs(&ifa) == -1) { 
     perror("getifaddrs failed"); 
     exit(1); 
    } 

    ifa_tmp = ifa; 
    BOOL ipv6Found = NO; 

    while (ifa_tmp) { 
     if ((ifa_tmp->ifa_addr) && ((ifa_tmp->ifa_addr->sa_family == AF_INET) || 
           (ifa_tmp->ifa_addr->sa_family == AF_INET6))) 
    { 
      if (ifa_tmp->ifa_addr->sa_family == AF_INET) { 
       // create IPv4 string 
       struct sockaddr_in *in = (struct sockaddr_in*) ifa_tmp->ifa_addr; 
       inet_ntop(AF_INET, &in->sin_addr, addr, sizeof(addr)); 
      } else { // AF_INET6 
       // create IPv6 string 
       struct sockaddr_in6 *in6 = (struct sockaddr_in6*) ifa_tmp->ifa_addr; 
      inet_ntop(AF_INET6, &in6->sin6_addr, addr, sizeof(addr)); 
     } 

     NSRange range = [[NSString stringWithFormat:@"%s",addr] rangeOfString:[NSString stringWithFormat:@":"]]; 
     if (range.location!=NSNotFound) 
     { 
      NSError *error = NULL; 
      NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@":" options:NSRegularExpressionCaseInsensitive error:&error]; 
      NSUInteger numberOfMatches = [regex numberOfMatchesInString:[NSString stringWithFormat:@"%s",addr] options:0 range:NSMakeRange(0, [[NSString stringWithFormat:@"%s",addr] length])]; 
      NSLog(@"Found -> %lu",(unsigned long)numberOfMatches); 
      if (numberOfMatches >= 7) { 
       ipv6Found = YES; 
       break; 
      } 
     } 
     //   printf("name = %s\n", ifa_tmp->ifa_name); 
     //   printf("addr = %s\n", addr); 
     } 
     ifa_tmp = ifa_tmp->ifa_next; 
    } 

    if (ipv6Found) { 
     return YES; 
    } else { 
     return NO; 
    } 
} 
を以下のヘッダを追加します。
関連する問題