回答編集履歴
2
回答内容に誤りがあったので修正しました
answer
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
コードは以下でIPv4,IPv6共にDNSサーバ情報が取得できました。
|
2
|
+
結局、サイトに乗っているままのコードでしたが、ライブラリの追加などが問題だと思います。
|
3
|
+
配列は回した方が良いと思います。
|
2
4
|
|
3
5
|
●ライブラリを追加
|
4
6
|
左上のプロジェクトアイコンを選択して「General」->「Linked Frameworks and Libraries」で「libresolv.9.tbd」を追加
|
@@ -11,14 +13,53 @@
|
|
11
13
|
|
12
14
|
●コード追加
|
13
15
|
```swift3
|
16
|
+
別クラスで実行
|
17
|
+
// 現在のDNSを取得
|
14
|
-
let
|
18
|
+
let tesDns = Resolver()
|
19
|
+
let curDnsArr = tesDns.getservers()
|
20
|
+
let curDns1 = tesDns.getnameinfo(curDnsArr[0])
|
21
|
+
let curDns2 = tesDns.getnameinfo(curDnsArr[1])
|
22
|
+
print ( "DNS:" )
|
23
|
+
print ( curDns1)
|
24
|
+
print ( curDns2)
|
25
|
+
}
|
15
26
|
|
16
|
-
|
27
|
+
class Resolver {
|
28
|
+
|
17
|
-
|
29
|
+
fileprivate var state = __res_9_state()
|
30
|
+
|
31
|
+
public init() {
|
32
|
+
res_9_ninit(&state)
|
33
|
+
}
|
34
|
+
|
35
|
+
deinit {
|
36
|
+
res_9_ndestroy(&state)
|
37
|
+
}
|
38
|
+
|
18
|
-
|
39
|
+
public func getservers() -> [res_9_sockaddr_union] {
|
40
|
+
|
41
|
+
let maxServers = 3
|
19
|
-
|
42
|
+
var servers = [res_9_sockaddr_union](repeating: res_9_sockaddr_union(), count: maxServers)
|
20
|
-
|
43
|
+
let found = Int(res_9_getservers(&state, &servers, Int32(maxServers)))
|
44
|
+
|
21
|
-
|
45
|
+
// filter is to remove the erroneous empty entry when there's no real servers
|
46
|
+
return Array(servers[0 ..< found]).filter() { $0.sin.sin_len > 0 }
|
47
|
+
}
|
48
|
+
|
49
|
+
public func getnameinfo(_ s: res_9_sockaddr_union) -> String {
|
50
|
+
var s = s
|
51
|
+
var hostBuffer = [CChar](repeating: 0, count: Int(NI_MAXHOST))
|
52
|
+
|
53
|
+
let _ = withUnsafePointer(to: &s) {
|
54
|
+
$0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
|
55
|
+
Darwin.getnameinfo($0, socklen_t(s.sin.sin_len),
|
56
|
+
&hostBuffer, socklen_t(hostBuffer.count),
|
57
|
+
nil, 0,
|
58
|
+
NI_NUMERICHOST)
|
59
|
+
}
|
60
|
+
}
|
61
|
+
|
22
|
-
|
62
|
+
return String(cString: hostBuffer)
|
63
|
+
}
|
23
64
|
}
|
24
65
|
```
|
1
見やすくコード欄に記載
answer
CHANGED
@@ -5,9 +5,12 @@
|
|
5
5
|
|
6
6
|
●ヘッダ追加
|
7
7
|
< プロジェクト名>-Bridging-Header.h
|
8
|
+
```swift3
|
8
9
|
#include <resolv.h>
|
10
|
+
```
|
9
11
|
|
10
12
|
●コード追加
|
13
|
+
```swift3
|
11
14
|
let curDns = dnsServers()
|
12
15
|
|
13
16
|
func dnsServers() -> [in_addr_t] {
|
@@ -17,4 +20,5 @@
|
|
17
20
|
let addresses = [sockets.0.sin_addr.s_addr]
|
18
21
|
//let filtered = addresses.filter { $0 != nil }
|
19
22
|
return addresses
|
20
|
-
}
|
23
|
+
}
|
24
|
+
```
|