获取INET4与INET6的信息

获取INET4与INET6的信息

参考书籍:

本人封装的源码:

//
//  IPAddressInfo.h
//  YXNETWORK
//
//  http://www.cnblogs.com/YouXianMing/
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface IPAddressInfo : NSObject

+ (NSDictionary *)net4Info;

@end
//
//  IPAddressInfo.m
//  YXNETWORK
//
//  http://www.cnblogs.com/YouXianMing/
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "IPAddressInfo.h"

#import <sys/types.h>
#import <sys/socket.h>
#import <netdb.h>
#import <arpa/inet.h>
#include <ifaddrs.h>
#include <arpa/inet.h>

static NSMutableDictionary *net4 = nil;
static NSMutableDictionary *net6 = nil;

@implementation IPAddressInfo

+ (void)initialize
{
    if (self == [IPAddressInfo class])
    {
        net4 = [NSMutableDictionary new];
        net6 = [NSMutableDictionary new];
    }
}

+ (NSDictionary *)net4Info
{
    [self updataInfo];
    
    return net4;
}

+ (void)updataInfo
{
    struct ifaddrs *interfaces = NULL;
    struct ifaddrs *temp_addr  = NULL;
    int success = 0;
    
    // 从当前接口中获取信息
    success = getifaddrs(&interfaces);
    if (success == 0)
    {
        // 遍历接口
        temp_addr = interfaces;
        for (temp_addr = interfaces; temp_addr != NULL; temp_addr = temp_addr->ifa_next)
        {
            if(temp_addr->ifa_addr->sa_family == AF_INET)
            {
                NSMutableDictionary *tmp = [NSMutableDictionary new];
                
                // INET4
                char naddr[INET_ADDRSTRLEN];
                char nmask[INET_ADDRSTRLEN];
                char ngate[INET_ADDRSTRLEN];
                
                inet_ntop(AF_INET,&((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr,naddr,INET_ADDRSTRLEN);
                inet_ntop(AF_INET,&((struct sockaddr_in *)temp_addr->ifa_netmask)->sin_addr,nmask,INET_ADDRSTRLEN);
                inet_ntop(AF_INET,&((struct sockaddr_in *)temp_addr->ifa_dstaddr)->sin_addr,ngate,INET_ADDRSTRLEN);
                
                NSString *interfaceName = [NSString stringWithUTF8String:temp_addr->ifa_name];
                NSString *address       = [NSString stringWithUTF8String:naddr];
                NSString *netmask       = [NSString stringWithUTF8String:nmask];
                NSString *gateway       = [NSString stringWithUTF8String:ngate];
                
                [tmp setObject:address forKey:@"address"];
                [tmp setObject:netmask forKey:@"netmask"];
                [tmp setObject:gateway forKey:@"gateway"];
                
                [net4 setObject:tmp forKey:interfaceName];
                
            }
            else if(temp_addr->ifa_addr->sa_family == AF_INET6)
            {
                // INET6
                char naddr[INET6_ADDRSTRLEN];
                char ngate[INET6_ADDRSTRLEN];
                
                inet_ntop(AF_INET6,&((struct sockaddr_in6 *)temp_addr->ifa_addr)->sin6_addr,naddr,INET6_ADDRSTRLEN);
                
                NSString *tmpGateway = nil;
                if ((struct sockaddr_in6 *)temp_addr->ifa_dstaddr != NULL)
                {
                    inet_ntop(AF_INET6,&((struct sockaddr_in6 *)temp_addr->ifa_dstaddr)->sin6_addr,ngate,INET6_ADDRSTRLEN);
                    tmpGateway = [NSString stringWithUTF8String:ngate];
                }
                else
                {
                    tmpGateway = @" ";
                }
                
//                NSString *interfaceName = [NSString stringWithUTF8String:temp_addr->ifa_name];
//                NSString *address = [NSString stringWithUTF8String:naddr];
//                NSString *netmask = @" ";
//                NSString *gateway = tmpGateway;
//                
//                NSLog(@"%@", interfaceName);
//                NSLog(@"%@", address);
//                NSLog(@"%@", netmask);
//                NSLog(@"%@", gateway);
            }
            else
            {
                continue;
            }
        }
    }
    
    // 释放资源
    freeifaddrs(interfaces);
}

@end

使用情况:

 

 

 

 

 

获取INET4与INET6的信息,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。