teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

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

2017/04/30 06:15

投稿

yamayamak
yamayamak

スコア131

answer CHANGED
@@ -1,4 +1,6 @@
1
- 以下でコードは動きました。が、Debug見てもDNSサーバ取得できていないですが。。
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 curDns = dnsServers()
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
- func dnsServers() -> [in_addr_t] {
27
+ class Resolver {
28
+
17
- var result = __res_9_state()
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
- guard res_9_ninit(&result) == 0 else { return [] }
39
+ public func getservers() -> [res_9_sockaddr_union] {
40
+
41
+ let maxServers = 3
19
- let sockets = result.nsaddr_list // note: nsaddr_list is a tuple, not an array
42
+ var servers = [res_9_sockaddr_union](repeating: res_9_sockaddr_union(), count: maxServers)
20
- let addresses = [sockets.0.sin_addr.s_addr]
43
+ let found = Int(res_9_getservers(&state, &servers, Int32(maxServers)))
44
+
21
- //let filtered = addresses.filter { $0 != nil }
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
- return addresses
62
+ return String(cString: hostBuffer)
63
+ }
23
64
  }
24
65
  ```

1

見やすくコード欄に記載

2017/04/30 06:15

投稿

yamayamak
yamayamak

スコア131

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
+ ```