I try to find a way how to get my DNS server ip which appear under settings->wi-fi->details->DNS. I don't know if apple allow to get this info programmatically.
This is (IMHO) a better Swift3+ variant, which is an extract of my Swift wrapper for libresolv as used by dig for iOS, and correctly handles IPV6 name servers:
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 }
    }
}
Converting a res_9_sockaddr_union to its string value can be done with this:
extension Resolver {
    public static func getnameinfo(_ s: res_9_sockaddr_union) -> String {
        var s = s
        var hostBuffer = [CChar](repeating: 0, count: Int(NI_MAXHOST))
        len sinlen = socklen_t(s.sin.sin_len)
        let _ = withUnsafePointer(to: &s) {
            $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
                Darwin.getnameinfo($0, sinlen,
                                   &hostBuffer, socklen_t(hostBuffer.count),
                                   nil, 0,
                                   NI_NUMERICHOST)
            }
        }
        return String(cString: hostBuffer)
    }
}
which all combined can get a String[] containing the list of servers like this:
let servers = Resolver().getservers().map(Resolver.getnameinfo)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With