Bonjour設定がオフになっている場合でも、ホスト名を使用してデバイス(プリンターなど)のIPアドレスを識別できるかどうかを尋ねたいのですが。また、その方法の例を教えてください。このシナリオを処理するiOSでアプリを開発しています。
私は以下を見てきました:
- getaddrinfo
- 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);
}