终于决定整理下这本书了
获取本机所有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 );
} }