2017-10-12 188 views
0

我們計劃用IPv6更新基於pjsip的iOS SDK。我們開發了IPv6環境。如果設備IP已經屬於IPv6 else 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; 
    } 
}