Finding DNS server settings programmatically on Mac OS X

前端 未结 5 1647
醉话见心
醉话见心 2020-12-10 18:55

I have some cross platform DNS client code that I use for doing end to end SMTP and on windows I can find the current DNS server ip addresses by looking in the registry. On

相关标签:
5条回答
  • 2020-12-10 19:06

    I know it's been a long time since you needed this, but there is nothing worse than a old unsolved answer. You can't access them from "/etc/resolv.conf" because of permission issues. After much searching, and a little luck I discovered you can get it via res_ninit() function.

    // 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);
    
    0 讨论(0)
  • 2020-12-10 19:08

    You can use the SystemConfiguration framework. It's in C.

    Update: apparently the rest of the web is harder to use than I thought. Search for the key "State:/Network/Service/ServiceID/DNS" where ServiceID is the ID of the service.

    0 讨论(0)
  • 2020-12-10 19:10

    You could read from /etc/resolv.conf.

    0 讨论(0)
  • 2020-12-10 19:26

    They are also available from /etc/resolv.conf

    0 讨论(0)
  • 2020-12-10 19:29

    I know its very late to answer this question but may be helpful for the others.

    This Code will help out for this task ..

    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.
    
    0 讨论(0)
提交回复
热议问题