2013-10-11 5 views
1

J'ai une application serveur fonctionnant sur un périphérique sur le réseau local qui est détectable via DNS-SD (ie Zeroconf/Bonjour/Avahi). Les périphériques clients, également sur le réseau local, se connectent à ce serveur. Je n'ai aucun contrôle sur quelle application est utilisée pour se connecter à mon application serveur, mais je sais qu'ils utilisent probablement DNS-SD et mDNS pour découvrir et se connecter au serveur. Comment puis-je récupérer le nom de domaine lien-local identifiant ces périphériques client donné uniquement leur adresse IP en C ou C++?Obtenir le lien du nom de domaine local à partir de l'adresse IP (c.-à-d. Recherche DNS inversée avec multidiffusion DNS et DNS-SD)

Selon RFC 6762 Multicast DNS-Section 4. Reverse Address Mapping:
« Comme » .local ", les domaines de mappage inverse IPv4 et IPv6 sont également définis comme lien local ... Puisque les noms sous ce domaine correspondent à IPv4 lien local. adresses, il est logique que le lien local est le meilleur endroit pour trouver des informations relatives à ces noms. "

Donc, théoriquement, il devrait être possible de rechercher les noms de domaine lien-local par adresse IP. Est-ce que quelqu'un sait comment? Peut-être que je ne cherche pas dans les bons endroits, mais je ne vois pas un appel API pour cela dans les documents Bonjour.

Répondre

1

J'ai fini par obtenir une réponse à cette question via la liste de diffusion Bonjour Dev d'Apple.

Selon le Quinn "The Eskimo!", voici comment vous pouvez le faire:

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); 
} 

Cet exemple trouverez le nom d'hôte lien local pour l'adresse IP 10.0.40.9. L'adresse IP est insérée dans l'ordre inverse.

Questions connexes