【问题标题】:How to perform DNS query on iOS如何在 iOS 上执行 DNS 查询
【发布时间】:2011-02-15 06:10:45
【问题描述】:

我想执行一些 DNS 查询,例如要获取针对特定域名的 IP 记录,我正在为 iOS 3.2+ SDK 寻找首选方式或一些有用的 sn-p。 提前谢谢

我从其他 sn-ps 中找到了这段代码

 Boolean result;
 CFHostRef hostRef;
 NSArray *addresses;
 NSString *hostname = @"apple.com";
 hostRef = CFHostCreateWithName(kCFAllocatorDefault, (CFStringRef)hostname);
 if (hostRef) {
      result = CFHostStartInfoResolution(hostRef, kCFHostAddresses, NULL); // pass an error instead of NULL here to find out why it failed
      if (result == TRUE) {
           addresses = (NSArray*)CFHostGetAddressing(hostRef, &result);
      }
 }
 if (result == TRUE) {
      [addresses enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
             NSString *strDNS = [NSString stringWithUTF8String:inet_ntoa(*((struct in_addr *)obj))];
           NSLog(@"Resolved %d->%@", idx, strDNS);
      }];

 } else {
      NSLog(@"Not resolved");
 }

但这会为每个主机生成相同的 IP 解析 0->220.120.64.1 有什么帮助吗??

【问题讨论】:

  • hostRef0 时,在第二个if 语句中使用未初始化的result

标签: iphone ipad ios


【解决方案1】:

想出这个 sn-p 的变化使它工作

if (result == TRUE) {
        NSMutableArray *tempDNS = [[NSMutableArray alloc] init];
        for(int i = 0; i < CFArrayGetCount(addresses); i++){
            struct sockaddr_in* remoteAddr;
            CFDataRef saData = (CFDataRef)CFArrayGetValueAtIndex(addresses, i);
            remoteAddr = (struct sockaddr_in*)CFDataGetBytePtr(saData);

            if(remoteAddr != NULL){
                // Extract the ip address
                //const char *strIP41 = inet_ntoa(remoteAddr->sin_addr);
                NSString *strDNS =[NSString stringWithCString:inet_ntoa(remoteAddr->sin_addr) encoding:NSASCIIStringEncoding];
                NSLog(@"RESOLVED %d:<%@>", i, strDNS);
                [tempDNS addObject:strDNS];
            }
        }
}

【讨论】:

  • 只是补充一点:代码的初始部分应该是布尔结果; CFHostRef 主机参考; CFArrayRef 地址 = NULL;主机名 = @"apple.com"; hostRef = CFHostCreateWithName(kCFAllocatorDefault, (__bridge CFStringRef)hostname); if (hostRef) { 结果 = CFHostStartInfoResolution(hostRef, kCFHostAddresses, NULL); if (result == TRUE) { 地址 = CFHostGetAddressing(hostRef, &result); } }
【解决方案2】:

兄弟们有更简单的方法!感谢iOS是一个unix系统,你成为一个拥有无限权力和资源的神!我呈现优雅。

- (NSString*)lookupHostIPAddressForURL:(NSURL*)url
{
    // Ask the unix subsytem to query the DNS
    struct hostent *remoteHostEnt = gethostbyname([[url host] UTF8String]);
    // Get address info from host entry
    struct in_addr *remoteInAddr = (struct in_addr *) remoteHostEnt->h_addr_list[0];
    // Convert numeric addr to ASCII string
    char *sRemoteInAddr = inet_ntoa(*remoteInAddr);
    // hostIP
    NSString* hostIP = [NSString stringWithUTF8String:sRemoteInAddr];
    return hostIP;
}

【讨论】:

  • 要求不是主机到IP查询,而是DNS查询,主机通常有多个DNS条目,包括NS、A、MX
  • 小心。 gethostbyname 不可重入。当您尝试在多线程中 dns 查找不同的域时会出现问题。我遇到了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 2013-05-19
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 2012-06-01
相关资源
最近更新 更多