从iPhone设置获取DNS服务器IP

我试图find一个方法如何让我的DNS服务器IP出现在settings->无线 – >细节 – > DNS。 我不知道苹果是否允许以编程方式获取此信息。

我在OS X上使用了它,并为我工作,(也链接到ibresolv.dylib)

#include <arpa/inet.h> #include <ifaddrs.h> #include <resolv.h> #include <dns.h> - (NSString *) getDNSAddressesStr { NSMutableString *addressStr = [[NSMutableString alloc]initWithString:@"DNS Addresses \n"]; res_state res = malloc(sizeof(struct __res_state)); int result = res_ninit(res); if ( result == 0 ) { for ( int i = 0; i < res->nscount; i++ ) { NSString *s = [NSString stringWithUTF8String : inet_ntoa(res->nsaddr_list[i].sin_addr)]; [addressStr appendFormat:@"%@\n",s]; NSLog(@"%@",s); } } else [addressStr appendString:@" res_init result != 0"]; return addressStr; } } 

支持IPV6的ObjC版本,如果Swift不在您的项目中:

 #include <resolv.h> #include <netdb.h> @implementation DNSResolver { res_state _state; } - (instancetype)init { self = [super init]; if (self) { _state = malloc(sizeof(struct __res_state)); if (EXIT_SUCCESS != res_ninit(_state)) { free(_state); return nil; } } return self; } - (void)dealloc { res_ndestroy(_state); free(_state); } #pragma mark - Public - (NSString *)getDNSAddressesCSV { NSMutableArray *addresses = [NSMutableArray new]; union res_sockaddr_union servers[NI_MAXSERV]; int serversFound = res_9_getservers(_state, servers, NI_MAXSERV); char hostBuffer[NI_MAXHOST]; for (int i = 0; i < serversFound; i ++) { union res_sockaddr_union s = servers[i]; if (s.sin.sin_len > 0) { if (EXIT_SUCCESS == getnameinfo((struct sockaddr *)&s.sin, // Pointer to your struct sockaddr (socklen_t)s.sin.sin_len, // Size of this struct (char *)&hostBuffer, // Pointer to hostname string sizeof(hostBuffer), // Size of this string nil, // Pointer to service name string 0, // Size of this string NI_NUMERICHOST)) { // Flags given [addresses addObject:[NSString stringWithUTF8String:hostBuffer]]; } } } return [addresses componentsJoinedByString:@","]; } @end 

我认为一个免费()是缺less的:

 free(res); 

ps for xCode 7将“libresolv.tbd”添加到“与二进制库链接”

这是(恕我直言)一个更好的Swift3变种,这是我的Swift3包装为libresolv提取用于iOS的挖掘 ,并正确处理IPV6名称服务器:

 open class Resolver { fileprivate var state = __res_9_state() public init() { res_9_ninit(&state) } deinit() { res_9_ndestroy(&state) } public final func getservers() -> [res_9_sockaddr_union] { let maxServers = 10 var servers = [res_9_sockaddr_union](repeating: res_9_sockaddr_union(), count: maxServers) let found = Int(res_9_getservers(&state, &servers, Int32(maxServers))) // filter is to remove the erroneous empty entry when there's no real servers return Array(servers[0 ..< found]).filter() { $0.sin.sin_len > 0 } } } 

res_9_sockaddr_union转换为其string值可以这样做:

 extension Resolver { public static func getnameinfo(_ s: res_9_sockaddr_union) -> String { var s = s var hostBuffer = [CChar](repeating: 0, count: Int(NI_MAXHOST)) let _ = withUnsafePointer(to: &s) { $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { Darwin.getnameinfo($0, socklen_t(s.sin.sin_len), &hostBuffer, socklen_t(hostBuffer.count), nil, 0, NI_NUMERICHOST) } } return String(cString: hostBuffer) } } 

所有组合都可以得到一个包含服务器列表的String[]

 let servers = Resolver().getservers().map(Resolver.getnameinfo) 

这是接受的答案的Swift3变种:

 func dnsServers() -> [in_addr_t] { var result = __res_9_state() guard res_9_ninit(&result) == 0 else { return [] } let sockets = result.nsaddr_list // note: nsaddr_list is a tuple, not an array let addresses = [sockets.0.sin_addr.s_addr, sockets.1.sin_addr.s_addr, sockets.2.sin_addr.s_addr] let filtered = addresses.filter { $0 != nil } return filtered } 

像往常一样,链接#import <resolv.h>并添加#import <resolv.h>桥接头