我们的需求是通过主机的域名去解析一个套有CDN 的主机地址,拿到10个ip地址然后分别做排序和最佳策略,进行数据通信。 但是尝试了很多的方法,都无法直接获取足够多的ip地址,所以我们怀疑是底层接口在返回的时候已经做了优选策略。
当然,与此同时,安卓同事拿到的DNS ip地址却是随机的。
好了,废话不多说,直接上代码,网上的很多代码都是C方法,个人不是很喜欢使用这种看起来高端,却并不灵活的方式
/// 获取本机DNS服务器
- (NSArray *)queryDNSforHost:(NSString *)hostname {
CFHostRef hostRef = CFHostCreateWithName(kCFAllocatorDefault, (__bridge CFStringRef)hostname);
Boolean result = CFHostStartInfoResolution(hostRef, kCFHostAddresses, NULL);
if (result == TRUE) {
NSArray *addresses = (__bridge NSArray*)CFHostGetAddressing(hostRef, &result);
NSMutableArray *tempDNS = [[NSMutableArray alloc] init];
for(int i = 0; i < addresses.count; i++){
struct sockaddr_in* remoteAddr;
CFDataRef saData = (__bridge CFDataRef)addresses[i];
remoteAddr = (struct sockaddr_in*)CFDataGetBytePtr(saData);
if(remoteAddr != NULL){
NSString *strDNS =[NSString stringWithCString:inet_ntoa(remoteAddr->sin_addr) encoding:NSASCIIStringEncoding];
if ([strDNS isEqualToString:@"0.0.0.0"]) {
continue;
}
[tempDNS addObject:strDNS];
}
}
return tempDNS;
}else{
return nil;
}
}
别忘了 #include <arpa/inet.h>