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;
2.建立循环获取每个 network interface的信息
3.创建三个char数组装 address、netmask和 gateway信息,这其中用到了INET6_ADDRSTRLEN因为它够大,IPV4/IPV6的信息都能装下
inet_ntop是用来将储存在sockaddr struct中的二进制信息转化为char array。
ntop中的n代表network,p代表presentation——“inet network to presentation”,与之相反的一个方法是inet_pton(将ASCII 字符转化为二进制)
另外在介绍下其中的两个struct
——————————————————————————————我是万恶的分割线————————————————————————————
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
接下来是NSHost版本,NSHost并不适用于iOS应用,iOS还是使用BSD
具体步骤(NSHost版本):
NSHost已经封装好address 和name,用起来很方便
1.获取网络地址信息
2.NSHost中的三个初始化方法
currentHost :当前正在使用的程序
hostWithAddress :提供IP地址的Host
hostWithName:提供hostname 的host,注意不加http//
获取本机所有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 ); } }
相关文章推荐
- java-模拟tomcat服务器
- Linux socket 初步
- C#基于socket模拟http请求的方法
- 简单的Ruby中的Socket编程教程
- Socket不能选择本地IP连接问题如何解决
- C#之Socket操作类实例解析
- C#使用Socket快速判断数据库连接是否正常的方法
- 科学知识:理解socket
- php与flash as3 socket通信传送文件实现代码
- 解决time_wait强制关闭socket
- C#使用Socket上传并保存图片的方法
- 深入php socket的讲解与实例分析
- JavaScript Archive Network 集合
- Linux网络编程之UDP Socket程序示例
- Linux网络编程之socket文件传输示例
- filezilla Failed to create listen socket on port 21 for IPv4 解决办法
- php socket方式提交的post详解
- PHP异步调用socket实现代码
- PHP实现Socket服务器的代码
- udp socket客户端和udp服务端程序示例分享