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

ios中 根据域名动态获取ip地址

2015-03-17 17:25 1086 查看
为什么动态获取ip呢,

在正常的网络请求中,理论上其实访问的是ip地址,互联网中用一个ip去标识一个计算机,但是单纯的用ip访问也会引发诸如安全性或因服务器变更引发的问题,所以dns出现了,不了解dns的 可以先去了解一下dns,dns的出现解决了ip访问引发的问题,但也造成请求时间和性能上的牺牲,因为多了一个去dns系统查询特定ip的操作,拿到ip之后再去进去服务器的访问请求,

如果我们在项目中直接就可以获取到ip的话,是不是直接就省略了我们的请求到dns的时间呢,只是之前放在网络处理的部分我们放在本地完成了而已,

//根据域名 动态获取ip地址

+ (NSString*)getIPWithHostName:(const NSString*)hostName

{

const char *hostN= [hostName UTF8String];

struct hostent* phot;

@try {

phot = gethostbyname(hostN);

if (phot == nil) {

return nil;

}

}

@catch (NSException *exception) {

return nil;

}

struct in_addr ip_addr;

memcpy(&ip_addr, phot->h_addr_list[0], 4);

char ip[20] = {0};

inet_ntop(AF_INET, &ip_addr, ip, sizeof(ip));

NSString* strIPAddress = [NSString stringWithUTF8String:ip];

return strIPAddress;

}

这个方法因为引用了一些c 库中的方法,需要引入三个文件

#include <netdb.h>

#include <sys/socket.h>

#include <arpa/inet.h>

这样就可以解决了!

注:因为从dns 获取特定ip 是网络操作,所以在断网情况下获取不到ip,大家需要酌情处理

------------2017.8.17 更新----------

因工作原因,一直没有来得及整理

上面讲的是获取ip的方式是通过底层api 从运营商处查询ip,还是会存在dns劫持可能,所以本地讲解的是第二种主流方案

基于DNSPod的ip解析,

查询方式为
http://119.29.29.29/d?dn=xxx
在我的App中目前使用的api请求框架也是基于AFNetwork+DnsPod 进行IP请求的方式,

ip处理原理:

1,通过dnspod获取到ip 存储到本地,每次应用从本地查询域名对应的 ip列表

2,每次启动app都会进行一次 域名的ip获取,更新本地ip,目的在于预防服务端变更ip的情况

小编自己的App中的请求框架现已开源:有需要的可以参考(去除了公司的Prism系统,用于包含api端的自签名系统和oAuth登录)

Github: https://github.com/xie244135119/AMDNetworkService
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息