我有一些跨平台 DNS 客户端代码,用于执行端到端 SMTP,在 Windows 上,我可以通过查看注册表找到当前的 DNS 服务器 IP 地址。在 Mac 上,我可能可以使用第一个答案中提到的 SystemConfiguration 框架,但是这样做的确切方法并不是很明显。
例如 SCDynamicStoreCopyDHCPInfo 返回一些动态 DHCP 相关数据,但不返回 DNS 服务器地址。
我有一些跨平台 DNS 客户端代码,用于执行端到端 SMTP,在 Windows 上,我可以通过查看注册表找到当前的 DNS 服务器 IP 地址。在 Mac 上,我可能可以使用第一个答案中提到的 SystemConfiguration 框架,但是这样做的确切方法并不是很明显。
例如 SCDynamicStoreCopyDHCPInfo 返回一些动态 DHCP 相关数据,但不返回 DNS 服务器地址。
我知道你需要这个已经很长时间了,但没有什么比一个旧的未解决的答案更糟糕的了。由于权限问题,您无法从“/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);
我知道回答这个问题很晚,但可能对其他人有帮助。
该代码将帮助完成这项任务..
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);
您可以使用SystemConfiguration 框架。它在 C 中。
更新:显然网络的其余部分比我想象的更难使用。搜索键“State:/Network/Service/ServiceID/DNS”,其中 ServiceID 是服务的 ID。
它们也可以从 /etc/resolv.conf 获得
您可以从 /etc/resolv.conf 中读取。