我只是想问一下,即使关闭 Bonjour 设置,是否可以使用其主机名识别设备(例如打印机)的 IP 地址?你也能给我一个例子来说明如何做到这一点吗?我正在 iOS 中开发一个应该处理这种情况的应用程序。
我看过以下内容:
- 获取地址信息
- CFHostStartInfoResolution
但它们仅在设备的 bonjour 开启时才起作用。
我只是想问一下,即使关闭 Bonjour 设置,是否可以使用其主机名识别设备(例如打印机)的 IP 地址?你也能给我一个例子来说明如何做到这一点吗?我正在 iOS 中开发一个应该处理这种情况的应用程序。
我看过以下内容:
但它们仅在设备的 bonjour 开启时才起作用。
假设主机名(比方说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 服务器具有广泛不同功能的家庭网络上。
从上一个答案中获取回调函数并将 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);
}