Die Suche nach DNS-Servereinstellungen programmatisch auf Mac OS X
-
06-07-2019 - |
Frage
Ich habe einig Cross-Plattform-DNS-Client-Code, den ich zu tun Ende verwenden SMTP zu beenden und an den Fenstern kann ich die aktuellen DNS-Server IP-Adressen, indem Sie in der Registrierung finden. Auf dem Mac kann ich wahrscheinlich den Systemconfiguration Rahmen verwenden, wie in der ersten Antwort erwähnt, aber die genaue Methode, dies zu tun nicht ohne weiteres ersichtlich ist.
Zum Beispiel SCDynamicStoreCopyDHCPInfo gibt einige der dynamischen DHCP-Daten, sondern nicht die DNS-Serveradressen.
Lösung
Sie sind auch von /etc/resolv.conf
Andere Tipps
Sie können über den Systemconfiguration Rahmen . Es ist in C.
Update: Es scheint der Rest der Bahn ist schwieriger zu verwenden, als ich dachte. Suchen Sie nach dem Schlüssel. "State: / Netzwerk / Service / ServiceID / DNS", wo ServiceID ist die ID des Dienstes
Ich weiß, dass seine sehr spät, diese Frage zu beantworten, kann aber für die andere hilfreich sein.
Dieser Kodex wird für diese Aufgabe helfen ..
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.
Ich weiß, dass es eine lange Zeit her ist, seit Sie diese benötigt, aber es gibt nichts Schlimmeres als eine alte ungelöste Antwort. Sie können nicht darauf zugreifen aus „/etc/resolv.conf“ wegen Berechtigungsprobleme. Nach langem Suchen und ein wenig Glück entdeckte ich Sie es über res_ninit () Funktion erhalten.
// 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);
Sie sind von /etc/resolv.conf lesen konnte.