获取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

使用情况:

 

目录
相关文章
|
5月前
|
网络协议 Unix Linux
`AF_INET`
`AF_INET`
98 3
|
4月前
|
网络协议 Python
`AF_INET6`
`AF_INET6` 是一个常量,在套接字编程中用于指定使用 IPv6 地址族。当你创建一个套接字(socket)时,你需要指定地址族(Address Family)、套接字类型以及协议。`AF_IN
|
4月前
|
Unix Linux
`AF_UNIX` 和 `AF_LOCAL`
`AF_UNIX` 和 `AF_LOCAL` 在使用socket()函数创建套接字时,具有相同的意义。它们都表示使用Unix域套接字(Unix Domain Socket),这种套接字主要用于在同一台
|
5月前
|
网络协议 安全 网络安全
原始套接字-SOCK_RAW
原始套接字-SOCK_RAW
|
5月前
|
网络协议 Linux C++
Linux C/C++ 网络编程中地址格式转换(inet_pton和inet_ntop函数)
Linux C/C++ 网络编程中地址格式转换(inet_pton和inet_ntop函数)
277 0
|
运维 监控 网络协议
Inet4AddressImpl.getHostByAddr 慢
Inet4AddressImpl.getHostByAddr 慢
163 0
|
网络协议 Linux
tcp/ip源码(18)——struct inet_sock中的cork用途
作者:gfree.wind@gmail.com 博客:linuxfocus.blog.chinaunix.net 在前面的学习过程中,遇到了位于struct inet_sock中的cork,当时没有把这个变量搞得很明白,没有完全搞清这个变量的用途。
1305 0
|
API
错误 C4996 ‘inet_ntoa‘: Use inet_ntop() or InetNtop() instead or define _WINS
错误 C4996 ‘inet_ntoa‘: Use inet_ntop() or InetNtop() instead or define _WINS
1543 0
|
网络协议 C++ 索引
TCP/IP源码(21)——struct inet_socks
本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。 作者:gfree.wind@gmail.com 博客:linuxfocus.blog.chinaunix.net     在前面的博文中,我画出了TCP/IP数据包发送的流程图。
1581 0