回答編集履歴

2

回答内容に誤りがあったので修正しました

2017/04/30 06:15

投稿

yamayamak
yamayamak

スコア131

test CHANGED
@@ -1,4 +1,8 @@
1
- 以下でコードは動きました。が、Debug見てもDNSサーバ取得できていないですが。。
1
+ コードは以下IPv4,IPv6共にDNSサーバ情報が取得できました
2
+
3
+ 結局、サイトに乗っているままのコードでしたが、ライブラリの追加などが問題だと思います。
4
+
5
+ 配列は回した方が良いと思います。
2
6
 
3
7
 
4
8
 
@@ -24,23 +28,101 @@
24
28
 
25
29
  ```swift3
26
30
 
31
+ 別クラスで実行
32
+
33
+ // 現在のDNSを取得
34
+
27
- let curDns = dnsServers()
35
+ let tesDns = Resolver()
36
+
37
+ let curDnsArr = tesDns.getservers()
38
+
39
+ let curDns1 = tesDns.getnameinfo(curDnsArr[0])
40
+
41
+ let curDns2 = tesDns.getnameinfo(curDnsArr[1])
42
+
43
+ print ( "DNS:" )
44
+
45
+ print ( curDns1)
46
+
47
+ print ( curDns2)
48
+
49
+ }
28
50
 
29
51
 
30
52
 
31
- func dnsServers() -> [in_addr_t] {
53
+ class Resolver {
32
54
 
33
- var result = __res_9_state()
55
+
34
56
 
35
- guard res_9_ninit(&result) == 0 else { return [] }
57
+ fileprivate var state = __res_9_state()
36
58
 
37
- let sockets = result.nsaddr_list // note: nsaddr_list is a tuple, not an array
59
+
38
60
 
39
- let addresses = [sockets.0.sin_addr.s_addr]
61
+ public init() {
40
62
 
41
- //let filtered = addresses.filter { $0 != nil }
63
+ res_9_ninit(&state)
42
64
 
65
+ }
66
+
67
+
68
+
69
+ deinit {
70
+
71
+ res_9_ndestroy(&state)
72
+
73
+ }
74
+
75
+
76
+
77
+ public func getservers() -> [res_9_sockaddr_union] {
78
+
79
+
80
+
43
- return addresses
81
+ let maxServers = 3
82
+
83
+ var servers = [res_9_sockaddr_union](repeating: res_9_sockaddr_union(), count: maxServers)
84
+
85
+ let found = Int(res_9_getservers(&state, &servers, Int32(maxServers)))
86
+
87
+
88
+
89
+ // filter is to remove the erroneous empty entry when there's no real servers
90
+
91
+ return Array(servers[0 ..< found]).filter() { $0.sin.sin_len > 0 }
92
+
93
+ }
94
+
95
+
96
+
97
+ public func getnameinfo(_ s: res_9_sockaddr_union) -> String {
98
+
99
+ var s = s
100
+
101
+ var hostBuffer = [CChar](repeating: 0, count: Int(NI_MAXHOST))
102
+
103
+
104
+
105
+ let _ = withUnsafePointer(to: &s) {
106
+
107
+ $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
108
+
109
+ Darwin.getnameinfo($0, socklen_t(s.sin.sin_len),
110
+
111
+ &hostBuffer, socklen_t(hostBuffer.count),
112
+
113
+ nil, 0,
114
+
115
+ NI_NUMERICHOST)
116
+
117
+ }
118
+
119
+ }
120
+
121
+
122
+
123
+ return String(cString: hostBuffer)
124
+
125
+ }
44
126
 
45
127
  }
46
128
 

1

見やすくコード欄に記載

2017/04/30 06:15

投稿

yamayamak
yamayamak

スコア131

test CHANGED
@@ -12,11 +12,17 @@
12
12
 
13
13
  < プロジェクト名>-Bridging-Header.h
14
14
 
15
+ ```swift3
16
+
15
17
  #include <resolv.h>
18
+
19
+ ```
16
20
 
17
21
 
18
22
 
19
23
  ●コード追加
24
+
25
+ ```swift3
20
26
 
21
27
  let curDns = dnsServers()
22
28
 
@@ -37,3 +43,5 @@
37
43
  return addresses
38
44
 
39
45
  }
46
+
47
+ ```