Поиск параметров DNS-сервера программно в Mac OS X - PullRequest
4 голосов
/ 04 ноября 2008

У меня есть некоторый кроссплатформенный код клиента DNS, который я использую для выполнения сквозного SMTP, и в Windows я могу найти текущие IP-адреса DNS-сервера, просматривая реестр. На Mac я, вероятно, могу использовать платформу SystemConfiguration, как упомянуто в первом ответе, однако точный способ сделать это не сразу очевиден.

Например, SCDynamicStoreCopyDHCPInfo возвращает некоторые данные, относящиеся к динамическому DHCP, но не адреса DNS-сервера.

Ответы [ 5 ]

5 голосов
/ 04 ноября 2008

Вы можете использовать SystemConfiguration Framework . Это в C.

Обновление: очевидно, остальная часть сети сложнее в использовании, чем я думал. Найдите ключ «State: / Network / Service / ServiceID / DNS», где ServiceID - это идентификатор службы.

4 голосов
/ 22 января 2016

Я знаю, что очень поздно отвечать на этот вопрос, но может быть полезным для других.

Этот код поможет при выполнении этой задачи.

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.
2 голосов
/ 18 ноября 2014

Я знаю, что прошло много времени с тех пор, как вы нуждались в этом, но нет ничего хуже, чем старый нерешенный ответ. Вы не можете получить к ним доступ из "/etc/resolv.conf" из-за проблем с разрешениями. После долгих поисков и небольшой удачи я обнаружил, что вы можете получить ее с помощью функции 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);
1 голос
/ 07 ноября 2008

Они также доступны с /etc/resolv.conf

0 голосов
/ 07 ноября 2008

Вы можете прочитать из /etc/resolv.conf.

...