2011-02-15 11 views
13

Quiero realizar algunas consultas sobre DNS, p. para obtener registros de IP contra un nombre de dominio específico, estoy buscando una forma preferida o algún fragmento útil para esto en iOS 3.2+ SDK. Gracias de antemanoCómo realizar una consulta DNS en iOS

parte de otros fragmentos i encontró este código

Boolean result; 
CFHostRef hostRef; 
NSArray *addresses; 
NSString *hostname = @"apple.com"; 
hostRef = CFHostCreateWithName(kCFAllocatorDefault, (CFStringRef)hostname); 
if (hostRef) { 
     result = CFHostStartInfoResolution(hostRef, kCFHostAddresses, NULL); // pass an error instead of NULL here to find out why it failed 
     if (result == TRUE) { 
      addresses = (NSArray*)CFHostGetAddressing(hostRef, &result); 
     } 
} 
if (result == TRUE) { 
     [addresses enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
      NSString *strDNS = [NSString stringWithUTF8String:inet_ntoa(*((struct in_addr *)obj))]; 
      NSLog(@"Resolved %d->%@", idx, strDNS); 
     }]; 

} else { 
     NSLog(@"Not resolved"); 
} 

pero esto está produciendo misma IP para cada host Resuelta 0-> 220.120.64.1 cualquier ayuda ??

+0

Cuando 'hostRef' es' 0', se utiliza un 'resultado' no inicializado en la segunda instrucción' if'. –

Respuesta

18

dimos cuenta de un cambio en este fragmento hace que funcione

if (result == TRUE) { 
     NSMutableArray *tempDNS = [[NSMutableArray alloc] init]; 
     for(int i = 0; i < CFArrayGetCount(addresses); i++){ 
      struct sockaddr_in* remoteAddr; 
      CFDataRef saData = (CFDataRef)CFArrayGetValueAtIndex(addresses, i); 
      remoteAddr = (struct sockaddr_in*)CFDataGetBytePtr(saData); 

      if(remoteAddr != NULL){ 
       // Extract the ip address 
       //const char *strIP41 = inet_ntoa(remoteAddr->sin_addr); 
       NSString *strDNS =[NSString stringWithCString:inet_ntoa(remoteAddr->sin_addr) encoding:NSASCIIStringEncoding]; 
       NSLog(@"RESOLVED %d:<%@>", i, strDNS); 
       [tempDNS addObject:strDNS]; 
      } 
     } 
} 
+1

gracias, esto fue muy útil :) –

+0

Gracias Esto está funcionando Muchachos muchas gracias !!! – parag

+2

Solo para agregar: la parte inicial del código debe ser Resultado booleano; CFHostRef hostRef; CFArrayRef addresses = NULL; nombre de host = @ "apple.com"; hostRef = CFHostCreateWithName (kCFAllocatorDefault, (__bridge CFStringRef) nombre de host); if (hostRef) { result = CFHostStartInfoResolution (hostRef, kCFHostAddresses, NULL); if (resultado == TRUE) { addresses = CFHostGetAddressing (hostRef, & result); } } –

7

Bros no es mucho más simple manera! ¡Gracias a que iOS es un sistema unix, te conviertes en un dios con poder y recursos ilimitados! Presento elegancia.

- (NSString*)lookupHostIPAddressForURL:(NSURL*)url 
{ 
    // Ask the unix subsytem to query the DNS 
    struct hostent *remoteHostEnt = gethostbyname([[url host] UTF8String]); 
    // Get address info from host entry 
    struct in_addr *remoteInAddr = (struct in_addr *) remoteHostEnt->h_addr_list[0]; 
    // Convert numeric addr to ASCII string 
    char *sRemoteInAddr = inet_ntoa(*remoteInAddr); 
    // hostIP 
    NSString* hostIP = [NSString stringWithUTF8String:sRemoteInAddr]; 
    return hostIP; 
} 
+0

el requisito no es una consulta de host a IP, pero es una consulta de DNS y un host generalmente tiene más de una entrada de DNS incluyendo, NS, A, MX – yasirmturk

+0

breve y claramente. –

+3

Ten cuidado. gethostbyname no es reingresante. Habrá un problema cuando intente buscar DNS en diferentes dominios en múltiples subprocesos. He encontrado el problema. – hrchen

Cuestiones relacionadas