iOS用域名或主机名获取IP地址(包含C语言接口 和iOS原生)

摘要:
=NULL)79{80//获取IP地址81charip[16];82strcpy;83return[NSStringstringWithUTF8String:ip];84}85}86}87CFRelease;88CFRelease;89returnnil;90}9192@end方法一,二中都是利用C的接口来实现,只不过在拿到hostent*之后处理的方式不一样,第二种方法相对要更快一点哟,另外,有些公司的域名可能是对应的服务器集群,会有很多个ip地址,像百度,网易啦这些,我们默认都是取的数组中的第一个元素,如果你有需求要拿到其他地址,遍历h_addr_list就可以啦。不过他们相差的时间都是非常非常小的,不到1毫秒的样子。
  

最近工作中遇到了个新需求、需要将域名 解析成ip地址,搜了搜文章博客,发现很多人都是在用C的

structhostent*gethostbyname(constchar*);

对于OC原生的方法还是比较陌生的,因此研究了一下,封了个方法出来,供大家参考使用,话不多说、上代码

1 #import "TestTools.h"
2 
3 #include <netdb.h>
4 #include <sys/socket.h>
5 #include <arpa/inet.h>
6 #include <resolv.h>
7 
8 @implementationTestTools
9 
10 + (NSString *)realmToIP:(NSString *)hostName{
11 
12     const char *host =[hostName UTF8String];
13     //Get host entry info for given host
14     struct hostent *remoteHostEnt =gethostbyname(host);
15     
16     //Get address info from host entry
17     struct in_addr *remoteInAddr = (struct in_addr *) remoteHostEnt->h_addr_list[0];
18     
19     //Convert numeric addr to ASCII string
20     char *sRemoteInAddr = inet_ntoa(*remoteInAddr);
21     
22     return [NSString stringWithFormat:@"%s",sRemoteInAddr];
23     
24 }
25 
26 + (NSString*)parsingIPAddress:(NSString*)strHostName
27 {
28     const char* szname =[strHostName UTF8String];
29     struct hostent*phot ;
30     @try
31 {
32         phot =gethostbyname(szname);
33 }
34     @catch (NSException *e)
35 {
36         returnnil;
37 }
38     
39     structin_addr ip_addr;
40     memcpy(&ip_addr,phot->h_addr_list[0],4);
41     
42     char ip[20] = {0};
43     inet_ntop(AF_INET, &ip_addr, ip, sizeof(ip));
44     
45     NSString* strIPAddress =[NSString stringWithUTF8String:ip];
46     
47     returnstrIPAddress;
48 }
49 
50 
51 + (NSString*)getIPAddressByHostName:(NSString*)strHostName{
52  
53 Boolean result,bResolved;
54 CFHostRef hostRef;
55     CFArrayRef addresses =NULL;
56     
57     const char * hostAdd =[strHostName UTF8String];
58     
59     CFStringRef hostNameRef =CFStringCreateWithCString(kCFAllocatorDefault, hostAdd, kCFStringEncodingASCII);
60     
61     hostRef =CFHostCreateWithName(kCFAllocatorDefault, hostNameRef);
62 
63     result =CFHostStartInfoResolution(hostRef, kCFHostAddresses, NULL);
64     if (result ==TRUE) {
65         addresses = CFHostGetAddressing(hostRef, &result);
66 }
67 
68     bResolved = result == TRUE ? true : false;
69     
70     if(bResolved)
71 {
72         struct sockaddr_in*remoteAddr;
73         for(int i = 0; i < CFArrayGetCount(addresses); i++)
74 {
75             CFDataRef saData =(CFDataRef)CFArrayGetValueAtIndex(addresses, i);
76             remoteAddr = (struct sockaddr_in*)CFDataGetBytePtr(saData);
77             
78             if(remoteAddr !=NULL)
79 {
80                 //获取IP地址
81                 char ip[16];
82                 strcpy(ip, inet_ntoa(remoteAddr->sin_addr));
83                 return[NSString stringWithUTF8String:ip];
84 }
85 }
86 }
87 CFRelease(hostNameRef);
88 CFRelease(hostRef);
89     returnnil;
90 }
91 
92 @end

方法一,二 中 都是利用C的接口来实现,只不过在拿到hostent * 之后处理的方式不一样,第二种方法相对要更快一点哟,另外,有些公司的域名可能是对应的服务器集群,会有很多个ip地址,像百度,网易啦这些, 我们默认都是取的数组中的第一个元素,如果你有需求要拿到其他地址, 遍历h_addr_list 就可以啦。

方法三,是利用OC原生的方法来实现的,

CFStringCreateWithCString();
CFHostCreateWithName();
我做了一个小小的测试,三个方法 在同一个环境下,对www.baidu.com进行多次解析 求平均值,解析的地址 肯定都是没问题的啦, 但是解析所用的时间却不一样哟,方法二 用时最短,其次是 方法一,方法三最慢。。。
不过他们相差的时间都是 非常非常小的,不到1毫秒的样子。

免责声明:文章转载自《iOS用域名或主机名获取IP地址(包含C语言接口 和iOS原生)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇unsigned long long类型与long long类型[luoguP1364] 医院设置(树的重心)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

iOS开发网络数据之AFNetworking使用

http网络库是集XML解析,Json解析,网络图片下载,plist解析,数据流请求操作,上传,下载,缓存等网络众多功能于一身的强大的类库。最新版本支持session,xctool单元测试。网络获取数据一直是手机软件的重中之重,如果处理的不好,会造成很差的用户体验。随着ASIHTTPRequest的停止更新,更换网络库是必然的事情,AFNetworking...

ipmitool管理工具

一、ipmitool简介 IPMI(Intelligent Platform Management Interface)智能平台管理接口 1、IPMI的核心是一个专用芯片/控制器(叫做服务器处理器或基板管理控制器(BMC)),其并不依赖于服务器的处理器、BIOS或操作系统来工作,可谓非常地独立,是一个单独在系统内运行的无代理管理子系统。 2、IPMI功能:...

再探NSString

再探NSString NSString应该是oc开发中最常用的一个数据类型了,这次对该类型再进行一次全方位的探索与总结。 NSString本质上属于OC类对象,继承于NSObject,遵守NSCopying, NSMutableCopying, NSSecureCoding协议。 NSMutableString与之类似,唯一不同的是它继承于NSStrin...

Greenplum源码编译安装(单机及集群模式)完全攻略

公司有个项目需要安装greenplum数据库,让我这个gp小白很是受伤,在网上各种搜,结果找到的都是TMD坑货帖子,但是经过4日苦战,总算是把greenplum的安装弄了个明白,单机及集群模式都部署成功,下面由我给大家分享一下整个部署过程,并小分析一下安装过程中遇到的各种坑。 首先,说一下我的环境,CentOS 7.2.1511,64位操作系统,全新安装,...

修改linux主机名与配置ssh通过主机名进行远程登录

具体步骤如下所示: 1、 vi /etc/hosts 2、vi /etc/hostname 3、vi /etc/sysconfig/network 4、需要重启服务器 reboot 5、分别在要连接的linux服务器上设置ip和hostname的映射 6、进入.ssh目录 ssh-keygen -t rsa ssh-copy-id centos@ce...

SqlAlchemy

SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。 Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如: 1 MySQL-Python 2...