0

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

我看过以下内容:

  1. 获取地址信息
  2. CFHostStartInfoResolution

但它们仅在设备的 bonjour 开启时才起作用。

4

2 回答 2

0

假设主机名(比方说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 服务器具有广泛不同功能的家庭网络上。

于 2012-09-26T01:17:01.683 回答
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);
}
于 2020-07-31T09:44:02.280 回答