您的位置:首页 > 移动开发 > IOS开发

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

2015-06-30 16:28 513 查看
终于决定整理下这本书了

获取本机所有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 );
} }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Network socket