2013-10-11 2 views
1

У меня есть серверное приложение, работающее на устройстве в локальной сети, которое можно обнаружить через DNS-SD (то есть Zeroconf/Bonjour/Avahi). Клиентские устройства, также подключенные к локальной сети, подключаются к этому серверу. Я не могу контролировать, какое приложение используется для подключения к моему серверному приложению, но я знаю, что они, вероятно, используют DNS-SD и mDNS для обнаружения и подключения к серверу. Как получить локальное доменное имя, идентифицирующее эти клиентские устройства, учитывая только их IP-адрес на C или C++?Получить локальное доменное имя с IP-адреса (т. Е. Обратный поиск DNS с помощью многоадресной DNS и DNS-SD)

По RFC 6762 Multicast DNS - Section 4. Reverse Address Mapping:
«Как» Местных ", домены обратного преобразования IPv4 и IPv6 также определяются быть локальной связи ... Так как имена в рамках этой области соответствуют IPv4 локальной связи. адресов, логично, что локальная связь - лучшее место для поиска информации, относящейся к этим именам ».

Таким образом, теоретически должно быть возможно найти локальные доменные имена по IP-адресу. Кто-нибудь знает как? Возможно, я не ищу в нужных местах, но я не вижу вызова API для этого в документах Bonjour.

ответ

1

Я получил ответ на этот вопрос через список рассылки Apple Bonjour Dev.

Согласно Quinn "The Eskimo!", вот как вы можете это сделать:

static void DNSCallback(
    DNSServiceRef      sdRef, 
    DNSServiceFlags      flags, 
    uint32_t       interfaceIndex, 
    DNSServiceErrorType     errorCode, 
    const char       *fullname, 
    uint16_t       rrtype, 
    uint16_t       rrclass, 
    uint16_t       rdlen, 
    const void       *rdata, 
    uint32_t       ttl, 
    void        *context 
) 
{ 
    const uint8_t *  cursor; 

    fprintf(stderr, "DNSCallback\n"); 
    assert(rrtype == kDNSServiceType_PTR); 
    assert(rrclass == kDNSServiceClass_IN); 
    cursor = (const uint8_t *) rdata; 
    while (*cursor != 0) { 
     fprintf(stderr, "%.*s.", (int) *cursor, cursor + 1); 
     cursor += *cursor + 1; 
    } 
    fprintf(stderr, "\n"); 
} 

static void SocketCallBack(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void *data, void *info) 
{ 
    DNSServiceErrorType err; 

    fprintf(stderr, "SocketCallBack\n"); 

    err = DNSServiceProcessResult(((AppDelegate *) info)->sdRef); 
    fprintf(stderr, "err = %d\n", (int) err); 
} 

- (IBAction)testAction:(id)sender 
{ 
    DNSServiceErrorType err; 
    int     sock; 
    CFSocketRef   cfSock; 

    fprintf(stderr, "-[AppDelegate testAction:]\n"); 

    assert(self->sdRef == NULL); 

    err = DNSServiceQueryRecord(
     &self->sdRef, 
     kDNSServiceFlagsForceMulticast, 
     0, 
     "9.40.0.10.in-addr.arpa.", 
     kDNSServiceType_PTR, 
     kDNSServiceClass_IN, 
     DNSCallback, 
     self 
    ); 
    fprintf(stderr, "err = %d\n", (int) err); 

    sock = DNSServiceRefSockFD(self->sdRef); 
    fprintf(stderr, "sock = %d\n", sock); 

    CFSocketContext context = { 0, self, NULL, NULL, NULL }; 

    cfSock = CFSocketCreateWithNative(NULL, sock, kCFSocketReadCallBack, SocketCallBack, &context); 
    assert(cfSock != NULL); 

    CFRunLoopSourceRef rls; 
    rls = CFSocketCreateRunLoopSource(NULL, cfSock, 0); 
    assert(rls != NULL); 

    CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode); 
} 

Этот пример найти ссылку локального имени хоста для IP-адреса 10.0.40.9. IP-адрес вставлен в обратном порядке.

Смежные вопросы