Cherry
Cherry

Reputation: 719

How to differentiate ipv4 and ipv6 in iOS?

We are planning to update our pjsip based iOS SDK with IPv6. We have developed IPv6 environment. We are planning to call IPv6 server(ipv6.url.com) if the Device IP has belonged to IPv6 else IPv4(ipv4.url.com). So from iOS SDK is there any way to differentiate IPv4 and IPv6?

Upvotes: 0

Views: 194

Answers (1)

Nazrul Islam
Nazrul Islam

Reputation: 768

Add the below headers first,

#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;
    }
}

Upvotes: 1

Related Questions