Domanda

Ho un codice client DNS multipiattaforma che utilizzo per eseguire SMTP end-to-end e su Windows posso trovare gli indirizzi IP del server DNS corrente cercando nel registro. Su Mac posso probabilmente usare il framework SystemConfiguration come menzionato nella prima risposta, tuttavia l'esatto metodo per farlo non è immediatamente ovvio.

Ad esempio SCDynamicStoreCopyDHCPInfo restituisce alcuni dei dati dinamici relativi al DHCP ma non gli indirizzi del server DNS.

È stato utile?

Soluzione

Sono disponibili anche da /etc/resolv.conf

Altri suggerimenti

Puoi utilizzare il SystemConfiguration framework . È in C.

Aggiornamento: apparentemente il resto del web è più difficile da usare di quanto pensassi. Cerca la chiave " Stato: / Rete / Servizio / ServiceID / DNS " dove ServiceID è l'ID del servizio.

So che è molto tardi per rispondere a questa domanda, ma può essere utile per gli altri.

Questo codice sarà di aiuto per questa attività.

SCPreferencesRef _prefsDNS = SCPreferencesCreate(NULL, CFSTR("DNSSETTING"), NULL);

CFArrayRef services = SCNetworkServiceCopyAll(_prefsDNS);

if (services) {
long count = CFArrayGetCount(services);
for (int i = 0; i < count; i++) {
service = CFArrayGetValueAtIndex(services, i);
interface = SCNetworkServiceGetInterface(service);
NSString *interfaceServiceID = (__bridge NSString*)SCNetworkServiceGetServiceID(service);
CFStringRef primaryservicepath = CFStringCreateWithFormat(NULL,NULL,CFSTR("State:/Network/Service/%@/DNS"),interfaceServiceID);
        //    NSLog(@"%@",primaryservicepath);


SCDynamicStoreRef dynRef=SCDynamicStoreCreate(kCFAllocatorSystemDefault, CFSTR("DNSSETTING"), NULL, NULL);
                // NSLog(@"%@",dynRef);
CFDictionaryRef dnskey = SCDynamicStoreCopyValue(dynRef,primaryservicepath);

           //     NSLog(@"%@",dnskey);
//dnskey will give you the DNS server address.

So che è passato molto tempo da quando ne avevi bisogno, ma non c'è niente di peggio di una vecchia risposta irrisolta. Non puoi accedervi da " /etc/resolv.conf" a causa di problemi di autorizzazione. Dopo molte ricerche e un po 'di fortuna ho scoperto che puoi ottenerlo tramite la funzione res_ninit ().

// Get native iOS System Resolvers
res_ninit(&_res);
res_state res = &_res;

for (int i = 0; i < res->nscount; i++) {
  sa_family_t family = res->nsaddr_list[i].sin_family;
  int port = ntohs(res->nsaddr_list[i].sin_port);
  if (family == AF_INET) { // IPV4 address
    char str[INET_ADDRSTRLEN]; // String representation of address
    inet_ntop(AF_INET, & (res->nsaddr_list[i].sin_addr.s_addr), str, INET_ADDRSTRLEN);
  } else if (family == AF_INET6) { // IPV6 address
    char str[INET6_ADDRSTRLEN]; // String representation of address
    inet_ntop(AF_INET6, &(res->nsaddr_list [i].sin_addr.s_addr), str, INET6_ADDRSTRLEN);
  }
}
res_ndestroy(res);

Puoi leggere da /etc/resolv.conf.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top