2013-06-26 1 views
1

J'ai cherché pendant un certain temps sans succès, comment suis-je censé obtenir un enregistrement DNS TXT pour un domaine en Objective-C?Objective-C: DNS TXT Record

Mon but est d'obtenir le même résultat que: dig -t txt google.com +short

PS: Non NSTask/bêchage s'il vous plaît! (Je le fais actuellement mais c'est mauvais). Le code peut être écrit en C, je vais juste écrire un wrapper plus tard. Je ne me soucie pas des règles de l'AppStore.

Merci!

+0

Pouvez-vous s'il vous plaît expliquer le mauvais au sujet de NSTask/pipping. J'utilise actuellement NSTask pour les requêtes txt DNS. –

+1

@sanjeevsharma s'il vous plaît vérifier la réponse acceptée est de résoudre votre problème. 'NSTask' et pipping sont mauvais car ils vous apportent des problèmes de sécurité et ne seront probablement pas acceptés sur l'AppStore. Il est plus facile pour un hacker de changer 'dig' en un autre binaire et d'élaborer une réponse DNS personnalisée ou d'injecter d'autres données dans votre application sans que vous le sachiez. – TCB13

Répondre

3

Utilisation DNSServiceQueryRecord dans dns_sd.h:

#import <dns_sd.h> 

// ... 

DNSServiceRef serviceRef; 

DNSServiceQueryRecord(&serviceRef, 0, 0, "hmspl.de", kDNSServiceType_TXT, 
         kDNSServiceClass_IN, queryCallback, NULL); 

DNSServiceProcessResult(serviceRef); 
DNSServiceRefDeallocate(serviceRef); 

// ... 

static void queryCallback(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) { 

    if (errorCode == kDNSServiceErr_NoError && rdlen > 1) { 
     NSMutableData *txtData = [NSMutableData dataWithCapacity:rdlen]; 

     for (uint16_t i = 1; i < rdlen; i += 256) { 
      [txtData appendBytes:rdata + i length:MIN(rdlen - i, 255)]; 
     } 

     NSString *theTXT = [[NSString alloc] initWithBytes:txtData.bytes length:txtData.length encoding:NSASCIIStringEncoding]; 
     NSLog(@"%@", theTXT); 
    } 
} 

Voir https://developer.apple.com/library/mac/#documentation/Networking/Reference/DNSServiceDiscovery_CRef/Reference/reference.html#//apple_ref/doc/c_ref/DNSServiceQueryRecord

+0

Des conseils sur pourquoi je reçois toujours un ordure au début de la chaîne? Je vous remercie. – TCB13

+1

Il s'agit d'un octet de longueur unique indiquant que la longueur du TXT est comprise entre 0 et 255. Je mettrai à jour ma réponse pour démarrer la valeur rdata à 1. – Danilo

+0

cela peut-il être fait de manière synchrone? – TCB13

0

peut utiliser comme ceci supprimer le code \ x02 \ x03, j'ai enlevé \ 0x12 \ 0x17 utilisation résultat de la vérification char $ man ascii [256 ] = {0}; dn_expand (rdata, rdata + rdlen, rdata, résultat, 256);

 NSMutableData *txtData = [NSMutableData dataWithCapacity:rdlen]; 

     char *p=(char*)rdata; 

     for (uint16_t i = 0; i < rdlen; i++) { 

      DLog(@"%c\n",*p); 
      if (*p > 0x20) { 
       [txtData appendBytes:p length:1]; 


      } 
      p++; 
     }