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

本文共 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://shxga.baihongyu.com/

你可能感兴趣的文章
VS Code搭建.NetCore开发环境(一)
查看>>
01字典树贪心查询+建立+删除(个人模版)
查看>>
java-信息安全(十一)-非对称加密算法ECC以及ECDSA签名
查看>>
(转)Flex的编译过程--ActionScript字节码(ABC)
查看>>
Directory Listing Denied
查看>>
今天讲座的感悟--java
查看>>
o(1)复杂度之双边滤波算法的原理、流程、实现及效果。
查看>>
corner2
查看>>
我见过的几种类型的员工(转)
查看>>
web前端的十种jquery特效及源码下载
查看>>
poj 3414 Pots (bfs+线索)
查看>>
Binary search
查看>>
http://jingyan.baidu.com/article/08b6a591f0fafc14a9092275.html
查看>>
MySQL查询数据表的Auto_Increment(自增id)
查看>>
java多线程系类:JUC集合:01之框架
查看>>
【Linux】 源码安装make命令详解,避免踩坑
查看>>
数据库中间表插入乱序
查看>>
[Python爬虫] 之四:Selenium 抓取微博数据
查看>>
使用OPENROWSET爆破SQL Server密码
查看>>
Mac_安装Homebrew以及Maven
查看>>