回答編集履歴
2
回答内容に誤りがあったので修正しました
test
CHANGED
@@ -1,4 +1,8 @@
|
|
1
|
-
|
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
|
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
|
-
|
53
|
+
class Resolver {
|
32
54
|
|
33
|
-
|
55
|
+
|
34
56
|
|
35
|
-
|
57
|
+
fileprivate var state = __res_9_state()
|
36
58
|
|
37
|
-
|
59
|
+
|
38
60
|
|
39
|
-
|
61
|
+
public init() {
|
40
62
|
|
41
|
-
|
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
|
-
|
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
見やすくコード欄に記載
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
|
+
```
|