Программный поиск настроек DNS-сервера в Mac OS X

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

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


person user33847    schedule 04.11.2008    source источник


Ответы (5)


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

person Rizwan Kassim    schedule 07.11.2008

Я знаю, что прошло много времени с тех пор, как вам это было нужно, но нет ничего хуже, чем старый нерешенный ответ. Вы не можете получить к ним доступ из «/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);
person kmdent    schedule 17.11.2014
comment
хороший код. небольшое улучшение: не забудьте связать с libresolv.dylib - person Maxim Kholyavkin; 19.01.2015
comment
альтернативная версия, не заглядывая во внутреннюю структуру res_state: stackoverflow.com/a/41303040/6782 - person Alnitak; 03.01.2017

Вы можете использовать инфраструктуру SystemConfiguration. Это в С.

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

person Community    schedule 04.11.2008
comment
Хорошо, сначала я попробовал SCDynamicStoreCopyDHCPInfo, и это дало мне текущий IP-адрес и сетевую маску + несколько других вещей, которые я не понимаю, но не DNS-серверы. Есть ли шанс, что вы можете быть более конкретным? - person user33847; 06.11.2008

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

Этот код поможет для этой задачи.

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.
person taha027    schedule 22.01.2016

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

person Sherm Pendley    schedule 07.11.2008