コードは以下でIPv4,IPv6共にDNSサーバ情報が取得できました。
結局、サイトに乗っているままのコードでしたが、ライブラリの追加などが問題だと思います。
配列は回した方が良いと思います。
●ライブラリを追加
左上のプロジェクトアイコンを選択して「General」->「Linked Frameworks and Libraries」で「libresolv.9.tbd」を追加
●ヘッダ追加
< プロジェクト名>-Bridging-Header.h
swift3
1#include <resolv.h>
●コード追加
swift3
1別クラスで実行
2 // 現在のDNSを取得
3 let tesDns = Resolver()
4 let curDnsArr = tesDns.getservers()
5 let curDns1 = tesDns.getnameinfo(curDnsArr[0])
6 let curDns2 = tesDns.getnameinfo(curDnsArr[1])
7 print ( "DNS:" )
8 print ( curDns1)
9 print ( curDns2)
10}
11
12class Resolver {
13
14 fileprivate var state = __res_9_state()
15
16 public init() {
17 res_9_ninit(&state)
18 }
19
20 deinit {
21 res_9_ndestroy(&state)
22 }
23
24 public func getservers() -> [res_9_sockaddr_union] {
25
26 let maxServers = 3
27 var servers = [res_9_sockaddr_union](repeating: res_9_sockaddr_union(), count: maxServers)
28 let found = Int(res_9_getservers(&state, &servers, Int32(maxServers)))
29
30 // filter is to remove the erroneous empty entry when there's no real servers
31 return Array(servers[0 ..< found]).filter() { $0.sin.sin_len > 0 }
32 }
33
34 public func getnameinfo(_ s: res_9_sockaddr_union) -> String {
35 var s = s
36 var hostBuffer = [CChar](repeating: 0, count: Int(NI_MAXHOST))
37
38 let _ = withUnsafePointer(to: &s) {
39 $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
40 Darwin.getnameinfo($0, socklen_t(s.sin.sin_len),
41 &hostBuffer, socklen_t(hostBuffer.count),
42 nil, 0,
43 NI_NUMERICHOST)
44 }
45 }
46
47 return String(cString: hostBuffer)
48 }
49}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。