在iOS中关闭Bonjour时使用主机名进行IP地址查找

时间:2012-09-21 07:41:38

标签: iphone ip-address bonjour hostname

我想询问是否可以使用其主机名识别设备(例如打印机)的IP地址,即使其Bonjour设置已关闭?你能给我一个如何做的例子吗?我正在iOS中开发一个应该处理这种情况的应用程序。

我看过以下内容:

  1. 的getaddrinfo
  2. CFHostStartInfoResolution
  3. 但它们仅在设备的bonjour打开时才有效。

2 个答案:

答案 0 :(得分:2)

假设主机名(假设为nameOfTheDevice)已在区域的权威DNS服务器中注册,您可以使用CFHost查找地址或主机名。例如:

NSString* hostname = @"nameOfTheDevice";
CFHostRef hostRef = CFHostCreateWithName(kCFAllocatorDefault, (CFStringRef)hostname);

Boolean lookup = CFHostStartInfoResolution(hostRef, kCFHostAddresses, NULL);
NSArray* addresses = (NSArray*)CFHostGetAddressing(hostRef, &lookup);

[addresses enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSString *strDNS = [NSString stringWithUTF8String:inet_ntoa(*((struct in_addr *)obj))];
       NSLog(@"Resolved %d->%@", idx, strDNS);
  }];

(请记住在生产代码中添加错误检查)。请记住,如果DNS服务器不知道该主机名,那么您无能为力。假设您能够执行成功的查找是不安全的,尤其是在内置DHCP / DNS服务器具有广泛不同功能的家庭网络上。

答案 1 :(得分:0)

从上一个答案中获取回调函数,并将obj作为参数传递给该函数

void printAddr(CFDataRef address)
{
    NSString *addressString;
    struct sockaddr *addressGeneric;

NSData *myData = (__bridge NSData*)address;
addressGeneric = (struct sockaddr*)[myData bytes];

switch(addressGeneric->sa_family) {
    case AF_INET: {
      struct sockaddr_in *ip4;
      char dest[INET_ADDRSTRLEN];
      ip4 = (struct sockaddr_in *) [myData bytes];
      addressString = [NSString stringWithFormat: @"IP4: %s", inet_ntop(AF_INET, &ip4->sin_addr, dest, sizeof dest)];
     }
     break;

    case AF_INET6: {
        struct sockaddr_in6 *ip6;
        char dest[INET6_ADDRSTRLEN];
        ip6 = (struct sockaddr_in6 *) [myData bytes];
        addressString = [NSString stringWithFormat: @"IP6: %s",  inet_ntop(AF_INET6, &ip6->sin6_addr, dest, sizeof dest)];
     }
     break;
 }

NSLog(@"%@", addressString);
}