iOS/Mac OS通过主机域名获取DNS ip地址

1,695 阅读1分钟

我们的需求是通过主机的域名去解析一个套有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>