0

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

私は以下を見てきました:

  1. getaddrinfo
  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 に答える