博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 本地DNS解析方法
阅读量:7071 次
发布时间:2019-06-28

本文共 2481 字,大约阅读时间需要 8 分钟。

介绍两种收集来的本地DNS解析的方式

- (NSArray*)DNSBySystem:(NSString *)dominName{    Boolean result = '\0',bResolved;    CFHostRef hostRef;    CFArrayRef addresses = NULL;    NSString *finalString = nil;    char tempChar[1000];    NSMutableArray *ipResults = [NSMutableArray arrayWithCapacity:10];    strcpy(tempChar,(char *)[dominName UTF8String]);    CFStringRef hostNameRef = CFStringCreateWithCString(kCFAllocatorDefault, tempChar, kCFStringEncodingASCII);    hostRef = CFHostCreateWithName(kCFAllocatorDefault, hostNameRef);    if (hostRef) {        result = CFHostStartInfoResolution(hostRef, kCFHostAddresses, NULL);        if (result == TRUE) {            addresses = CFHostGetAddressing(hostRef, &result);        }    }    bResolved = result == TRUE ? true : false;        if(bResolved)    {        struct sockaddr_in* remoteAddr;        for(int i = 0; i < CFArrayGetCount(addresses); i++)        {            CFDataRef saData = (CFDataRef)CFArrayGetValueAtIndex(addresses, i);            remoteAddr = (struct sockaddr_in*)CFDataGetBytePtr(saData);            if(remoteAddr != NULL)            {                //DNS解析结果cpy到char数组里                char ip[16];                strcpy(ip, inet_ntoa(remoteAddr->sin_addr));                finalString = [NSString stringWithCString:ip encoding:NSUTF8StringEncoding];                [ipResults addObject:finalString];            }        }    }    CFRelease(hostNameRef);    CFRelease(hostRef);    return ipResults;}复制代码

上面这种方法在IPv6环境下解析有点问题,IPv4下无问题。下面这种方法两种环境下都适用

- (NSArray *)dnsByLocal:(NSString *)domain {    if (domain.length == 0) {        return nil;    }    struct addrinfo hints;    memset(&hints, 0, sizeof(hints));    hints.ai_family = PF_INET;    hints.ai_protocol = IPPROTO_TCP;    struct addrinfo *addrs, *addr;        int getResult = getaddrinfo([domain UTF8String], NULL, &hints, &addrs);    if (getResult || addrs == nil) {        NSLog(@"Warn: DNS with domain:%@ failed:%d", domain, getResult);        return nil;    }    addr = addrs;    NSMutableArray *result = [NSMutableArray array];    for (addr = addrs; addr; addr = addr->ai_next) {        char host[NI_MAXHOST];        memset(host, 0, NI_MAXHOST);        getnameinfo(addr->ai_addr, addr->ai_addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST);        if (strlen(host) != 0) {            [result addObject:[NSString stringWithUTF8String:host]];        }    }    freeaddrinfo(addrs);    NSLog(@"Info: DNS with domain:%@ -> %@", domain, result);    return result;}复制代码

转载地址:http://rhhll.baihongyu.com/

你可能感兴趣的文章
使用mosh取代ssh提高n2n网络连接稳定性
查看>>
Introduction - 介绍
查看>>
C++之萃取技术(traits)
查看>>
13、ArrayBlocking
查看>>
windows强行删除无法删出文件或文件夹的方法
查看>>
毕业生的摸爬滚打——劳务协议和劳务报酬的计算
查看>>
Java课程作业01
查看>>
#HTTP协议学习# (十)拓展-HTTPS协议
查看>>
电梯调度 最终版
查看>>
mysql索引详解(转)
查看>>
php html 静态化 缓存
查看>>
测试架构师修炼之道:“秘书九段”的故事 - 延伸至测试六段
查看>>
windows ce 6.0启动过程分析(引用)
查看>>
silverlight 定时器 System.Windows.Threading.DispatcherTimer
查看>>
The serializable class XXX does not declare a static final serialVersionUID field of type long
查看>>
Silverlight数据验证
查看>>
js事件绑定的几种方式
查看>>
设计模式之创建型模式
查看>>
【转】领导力:用人要疑,疑人也要用
查看>>
centos下安装mongodb
查看>>