获取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的信息,布布扣,bubuko.com

时间: 2024-08-03 09:14:02

获取INET4与INET6的信息的相关文章

ios项目开发(天气预报项目):使用正则获取 weather.com.cn网站信息

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片 <pre code_snippet_id="346208" snippet_file_name="blog_20140515_1_2220869" name="code" class="cpp">- (NSString *)hmacsha1:(NSString *)text key:(NSString *)secret {

[C语言](二)01 获取Windows图形构件大小信息

SYSMETS.c #include <windows.h> #include "SYSMETS.H"//自定义的单元,所以用"",不是用<> //消息循环处理函数,Windows回调函数 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //Windows程序的入口函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevIn

【工具】获取窗口与控件信息

[工具]获取窗口与控件信息 常言道,工欲善其事,必先利其器.在脚本中常见的一种操作是操作窗口或控件,在操作之前,首先必须获取目标的各种信息,这时就要用上辅助工具了.本文会介绍一些获取窗口.控件信息的常用工具,这里的先后顺序是随意安排.如果目前用的没什么问题就继续用着,如果对某些地方不满意则可试试其他.简单的截图不容易全面反映整个工具的功能和特色,使用才能获得真实体验. Active Window Info 评论:这个最初来自于 AutoIt3 且安装包中自带的工具,就无需过多介绍了.功能简陋,但

获取DNS服务器的版本信息

1 如何获取DNS服务器的版本信息 向某个DNS服务器发送下面的请求即可获得版本信息 ? 1 dig @115.124.17.156 version.bind chaos txt 它返回的信息如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ; <<>> DiG 9.7.0-P2-RedHat-9.7.0-5.P2.el6 <<>> @115.124.17.156 version.bind

SQLServer中使用扩展事件获取Session级别的等待信息以及SQLServer 2016中Session级别等待信息的增强

本文出处:http://www.cnblogs.com/wy123/p/6835939.html 什么是等待 简单说明一下什么是等待:当应用程序对SQL Server发起一个Session请求的时候,这个Session请求在数据库中执行的过程中会申请其所需要的资源,比如可能会申请内存资源,表上的锁资源,物理IO资源,网络资源等等,如果当前Session运行过程中需要申请的某些资源无法立即得到满足,就会产生等待.SQL Server会以不用的方式来展现这个等待信息,比活动Session的等待信息,

通过Hibernate配置获取数据库表的具体信息

/** * 通过Hibernate配置获取数据库表的具体信息 * @author 晚风工作室 www.soservers.com * */ 标签: Hibernate [1].[代码] [Java]代码 跳至 [1] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 5

【转】MSSQL获取指定表的列名信息,描述,数据类型,长度

/* --作用:根据特定的表名查询出字段,以及描述,数据类型,长度,精度,是否自增,是否为空等信息 --作者:wonder QQ:37036846 QQ群:.NET顶级精英群 ID:124766907 --时间:2011-03-23 11:25 --描述:创建存储过程 --参数:@tableName 表名 */ CREATE PROC sp_GetListsColumnInfoByTableName( @tableName nvarchar(255)) AS BEGIN SELECT CASE

Python中获取异常(Exception)信息

异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序结构.如下所示 try: ... except Exception as e: ... 1.str(e) 返回字符串类型,只给出异常信息,不包括异常信息的类型,如1/0的异常信息 'integer division or modulo by zero' 2.repr(e) 给出较全的异常信息,包括异

java获取它运行所在目录信息

对于Java程序,无论是未打包的还是打包的JAR或WAR文件,有时候都需要获取它运行所在目录信息,如何做到这一点呢?  在Java处理的文件系统中,目录的表示方式有两种:  (1)绝对目录,它以"/"为起始字符,代表从根目录下开始寻找给出的目录,如/c:/java  (2)相对路径,它以不带"/"的目录名表示,表示以当前Java程序正在运行的目录作为起始目录来寻找给出的目录.如java/classes.在相对路径中,有一些特定的字符,可以代表特的的目录,比如,&qu