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
在正常的网络请求中,理论上其实访问的是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
相关文章推荐
- 根据域名动态获取IP地址(iOS)
- iOS 根据域名获取ip地址
- vc根据域名获取IP地址 gethostbyname()函数
- C# 根据域名获取IP地址
- vc根据域名获取IP地址 gethostbyname()函数
- 一、java根据域名获取ip地址
- vc根据域名获取IP地址 gethostbyname()函数
- [Win32]根据主机名、域名、IP字符串获取IP地址
- Java学习笔记之网络编程基础-根据域名自动到DNS上获取IP地址
- 根据域名获取ip地址
- vc根据域名获取IP地址 gethostbyname()函数
- VC++根据域名获取IP地址GetHostByName()
- oracle 中如何获取本机ip地址,根据IP地址获取域名?
- 根据域名获取IP地址,并探测是否可达
- C/C++ 根据域名获取IP地址
- 根据域名获取IP地址
- 根据域名获取IP地址
- java网络编程根据域名获取ip地址,URL
- iOS版本号,build号获取,根据字符串格式长短动态计算uilabel的size等
- vc根据域名获取IP地址 gethostbyname()函数