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

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

你可能感兴趣的文章
.net中验证码的几种常用方法
查看>>
解决OracleDBConsoleorcl不能启动
查看>>
.net DLL程序集中打包另一个DLL
查看>>
我的友情链接
查看>>
Drupal第三方模块汇集(一)
查看>>
我的友情链接
查看>>
使用spring的自身的listener进行web的配置
查看>>
linux学习之“VI”与“VIM”
查看>>
linux下无线网卡驱动安装
查看>>
oracle recyclebin与flashback drop
查看>>
我的友情链接
查看>>
svmlight使用说明
查看>>
LVM
查看>>
学习之shell脚本
查看>>
Andorid Launcher程序代码分析
查看>>
Swing 和AWT之间的关系
查看>>
Mysql设置自增长主键的初始值
查看>>
Android计时器正确应用方式解析
查看>>
性能及监控
查看>>
linux系统CPU、内存、硬盘、网络、lnmp服务整体监控邮件报警
查看>>