【问题标题】:Finding DNS server settings programmatically on Mac OS X在 Mac OS X 上以编程方式查找 DNS 服务器设置
【发布时间】:2008-11-04 01:14:20
【问题描述】:

我有一些跨平台的 DNS 客户端代码,用于执行端到端 SMTP,在 Windows 上,我可以通过查看注册表找到当前的 DNS 服务器 IP 地址。在 Mac 上,我可能可以使用第一个答案中提到的 SystemConfiguration 框架,但是这样做的确切方法并不是很明显。

例如 SCDynamicStoreCopyDHCPInfo 返回一些动态 DHCP 相关数据,但不返回 DNS 服务器地址。

【问题讨论】:

    标签: macos dns macos-carbon


    【解决方案1】:

    我知道你已经很久没有需要这个了,但没有什么比一个旧的未解决的答案更糟糕的了。由于权限问题,您无法从“/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);
    

    【讨论】:

    【解决方案2】:

    我知道回答这个问题已经很晚了,但可能对其他人有帮助。

    此代码将帮助完成这项任务..

    SCPreferencesRef prefsDNS = SCPreferencesCreate(NULL, CFSTR("DNSSETTING"), NULL);
    CFArrayRef services = SCNetworkServiceCopyAll(prefsDNS);
    long servicesCount = CFArrayGetCount(services);
    for (long i = 0; i < servicesCount; i++) {
        const SCNetworkServiceRef service = (const SCNetworkServiceRef)CFArrayGetValueAtIndex(services, i);
        CFStringRef interfaceServiceID = SCNetworkServiceGetServiceID(service);
        CFStringRef primaryservicepath = CFStringCreateWithFormat(NULL,NULL,CFSTR("State:/Network/Service/%@/DNS"),interfaceServiceID);
        SCDynamicStoreRef dynRef = SCDynamicStoreCreate(kCFAllocatorSystemDefault, CFSTR("DNSSETTING"), NULL, NULL);
        CFPropertyListRef propList = SCDynamicStoreCopyValue(dynRef,primaryservicepath);
        if (propList) {
            CFDictionaryRef dict = (CFDictionaryRef)propList;
            CFArrayRef addresses = (CFArrayRef)CFDictionaryGetValue(dict, CFSTR("ServerAddresses"));
            long addressesCount = CFArrayGetCount(addresses);
            for (long j = 0; j < addressesCount; j++) {
                CFStringRef address = (CFStringRef)CFArrayGetValueAtIndex(addresses, j);
                // Print address
                CFShow(address);
            }
            CFRelease(propList);
        }
        CFRelease(dynRef);
        CFRelease(primaryservicepath);
    }
    CFRelease(services);
    CFRelease(prefsDNS);
    

    【讨论】:

      【解决方案3】:

      您可以使用SystemConfiguration framework。它在 C 中。

      更新:显然网络的其余部分比我想象的更难使用。搜索键“State:/Network/Service/ServiceID/DNS”,其中 ServiceID 是服务的 ID。

      【讨论】:

      • 好的,我最初尝试了 SCDynamicStoreCopyDHCPInfo,它让我得到了当前的 IP 地址和网络掩码 + 其他一些我不明白的东西,但不是 DNS 服务器。有没有机会说得更具体些?
      【解决方案4】:

      它们也可以从 /etc/resolv.conf

      【讨论】:

        【解决方案5】:

        您可以从 /etc/resolv.conf 中读取。

        【讨论】:

          猜你喜欢
          • 2021-08-06
          • 1970-01-01
          • 1970-01-01
          • 2012-06-25
          • 2011-02-02
          • 2012-04-30
          • 1970-01-01
          • 1970-01-01
          • 2015-03-22
          相关资源
          最近更新 更多