在Mac OS X上以编程方式查找DNS服务器设置

时间:2008-11-04 01:14:20

标签: macos dns macos-carbon

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

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

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

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

本准则将有助于完成此任务..

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 :(得分:2)

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

答案 3 :(得分:1)

他们也可以从 /etc/resolv.conf中

答案 4 :(得分:-1)

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