iOS and OS X Network Programming Cookbook |Retrieving network address information

11 篇文章 0 订阅

终于决定整理下这本书了


获取本机所有network的信息(interface name,IP版本,IP地址,掩码和网关,我并不知道他们干吗用的。。),首先创建一个NetworkAddressStore类来存储这些信息

然后再获取所有的active network interface,并为每一个创建一个NetworkAddressStore实例,将这些存储在数组中。


具体步骤(BSD socket版本):

1.获取网络地址信息,并将信息存储在ifaddrs structures中,成功返回0,失败返回-1

2.建立循环获取每个 network interface的信息

3.创建三个char数组装 address、netmask和 gateway信息

4.获取 address、netmask和 gateway,然后输出



1.getifaddrs(struct ifaddrs **ifad )方法用来获取网络地址信息,并将信息存储在ifaddrs structures中,成功返回0,失败返回-1;

struct ifaddrs *interfaces = NULL;
int success = 0;
success = getifaddrs(&interfaces);

2.建立循环获取每个 network interface的信息

struct ifaddrs *temp_addr = interfaces;
       for (temp_addr = interfaces; temp_addr != NULL; temp_addr =
         temp_addr->ifa_next) {
             int ipversion;
             NSLog(@"************************");
             if(temp_addr->ifa_addr->sa_family == AF_INET) {
                 NSLog(@"IPv4");
                 ipversion = AF_INET;
             } else if(temp_addr->ifa_addr->sa_family == AF_INET6) {
                 NSLog(@"IPv6");
                 ipversion = AF_INET6;
             } else {
                 NSLog(@"Unknown IP version");
                 ipversion = 0;
             }

3.创建三个char数组装 address、netmask和 gateway信息,这其中用到了INET6_ADDRSTRLEN因为它够大,IPV4/IPV6的信息都能装下

char naddr[INET6_ADDRSTRLEN];
char nmask[INET6_ADDRSTRLEN];
char ngate[INET6_ADDRSTRLEN];
4.获取 address、netmask和 gateway,然后输出

NSLog(@"Name:  %@",[NSString stringWithUTF8String:temp_addr-
       >ifa_name]);
             inet_ntop(ipversion,&((struct sockaddr_in *)temp_addr->ifa_
       addr)->sin_addr,naddr,INET_ADDRSTRLEN);
             NSLog(@"Address:  %@",[NSString
       stringWithUTF8String:naddr]);
             if ((struct sockaddr_in6 *)temp_addr->ifa_netmask != NULL) {
                 inet_ntop(ipversion,&((struct sockaddr_in *)temp_addr-
       >ifa_netmask)->sin_addr,nmask,INET_ADDRSTRLEN);
                 NSLog(@"Netmask:  %@", [NSString
       stringWithUTF8String:nmask]);
             }
             if ((struct sockaddr_in6 *)temp_addr->ifa_dstaddr != NULL) {
                 inet_ntop(ipversion,&((struct sockaddr_in *)temp_addr-
       >ifa_dstaddr)->sin_addr,ngate,INET_ADDRSTRLEN);
                 NSLog(@"Gateway:  ", [NSString
       stringWithUTF8String:ngate]);
             }
}
       freeifaddrs(interfaces);

inet_ntop是用来将储存在sockaddr struct中的二进制信息转化为char array。

ntop中的n代表network,p代表presentation——“inet network to presentation”,与之相反的一个方法是inet_pton(将ASCII 字符转化为二进制)


另外在介绍下其中的两个struct

struct ifaddrs  {  *ifa_next;//指向下一个struct
    char             *ifa_name;//interface name
    u_int             ifa_flags;//<span style="font-family:Arial, Helvetica, sans-serif;">interface flags</span>
    struct sockaddr  *ifa_addr;//interface address
    struct sockaddr  *ifa_netmask; //Interface netmask 
    struct sockaddr  *ifa_dstaddr; /*P2P interface destination or
   Broadcast address ,就是这里用到的gateway*/
       void             *ifa_data;    /*Address specific data */
}

struct sockaddr {
     uint8_t sa_len;
     sa_family_t sa_family;
     char sa_data[14];
}

——————————————————————————————我是万恶的分割线————————————————————————————

//

接下来是NSHost版本,NSHost并不适用于iOS应用,iOS还是使用BSD

具体步骤(NSHost版本):

NSHost已经封装好address 和name,用起来很方便

1.获取网络地址信息

2.NSHost中的三个初始化方法 

currentHost :当前正在使用的程序

hostWithAddress :提供IP地址的Host

hostWithName:提供hostname 的host,注意不加http//


NSHost* myHost =[NSHost currentHost];
       if (myHost)
       {
         NSArray *addresses = [myHost addresses];
         for (NSString *address in addresses) {
           NSLog(@"%@", address );
} }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值