iOSアプリ開発に向けて、Network Frameworkを使ってUDP Multicast通信をやってみる。細かい所はまだわかっていないけど、以下のコードで、WindowsでMulticastした電文の送受信までは動いた*1。
import Network guard let multicast = try? NWMulticastGroup(for: [ .hostPort(host: "224.0.23.0", port: 3610) ]) else { fatalError("error in Muticast") } let group = NWConnectionGroup(with: multicast, using: .udp) group.setReceiveHandler(maximumMessageSize: 1024, rejectOversizedMessages: true) { (message, content, isComplete) in print("Received message from \(String(describing: message.remoteEndpoint))") //let sendContent = Data("ack".utf8) //message.reply(content: sendContent) } group.stateUpdateHandler = { (newState) in print("Group entered state \(String(describing: newState))") } let queue = DispatchQueue(label: "ExampleNetwork") group.start(queue: queue) //group.start(queue: .main) sleep(10) let str = "helloAll" let groupSendContent = str.data(using: .utf8) group.send(content: groupSendContent) { (error) in print("Send complete with error \(String(describing: error))") } group.cancel() print("bye")
実行結果の表示
Group entered state waiting(POSIXErrorCode: Network is down) Group entered state ready // ・・状態がReadyに遷移 Received message from Optional(192.168.10.155:62725) // ・・・送信しているWindows側IP Received message from Optional(192.168.10.155:62726) Send complete with error nil Received message from Optional(192.168.10.161:50947) // ・・・Multicastした自分自身のIP Received message from Optional(192.168.10.155:62727) bye Group entered state cancelled // ・・状態がCancelledに遷移
ネットワークの状態がReadyに遷移したタイミングでUDPマルチキャストを投げるように修正
受信データを表示させたいが、型変換がよくわからずWarningになっている。
Swiftの基本仕様がわかっていない。。
import Network guard let multicast = try? NWMulticastGroup(for: [ .hostPort(host: "224.0.23.0", port: 3610) ]) else { fatalError("error in Muticast") } let group = NWConnectionGroup(with: multicast, using: .udp) group.setReceiveHandler(maximumMessageSize: 1024, rejectOversizedMessages: true) { (message, content, isComplete) in print("Received message from \(String(describing: message.remoteEndpoint))") //let message = String(data: content, encoding: .utf8) //let message = Data(content, encoding: .utf8) print(content) //let sendContent = Data("ack".utf8) //message.reply(content: sendContent) } group.stateUpdateHandler = { (newState) in print("Group entered state \(String(describing: newState))") switch newState { case .ready: print("ready") let str = "helloAll" let groupSendContent = str.data(using: .utf8) group.send(content: groupSendContent) { (error) in print("Send complete with error \(String(describing: error))") } case .waiting(let error): print("waiting") print(error) case .setup: print("setup") case .cancelled: print("cancelled") case .failed: print("failed") //case .preparing: // print("preparing") default: print("default") } } let queue = DispatchQueue(label: "ExampleNetwork") group.start(queue: queue) //group.start(queue: .main) sleep(5) group.cancel() print("bye")
■参考にした記事
Swiftでコマンドラインツール作成の誘い - Qiita
*1:受信データの内容は未確認