我想询问是否可以使用其主机名识别设备(例如打印机)的IP地址,即使其Bonjour设置已关闭?你能给我一个如何做的例子吗?我正在iOS中开发一个应该处理这种情况的应用程序。
我看过以下内容:
但它们仅在设备的bonjour打开时才有效。
答案 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);
}