Swift: Receive UDP with GCDAsyncUdpSocket Swift: Receive UDP with GCDAsyncUdpSocket swift swift

Swift: Receive UDP with GCDAsyncUdpSocket


I finally got it to work with this socket setup:

func setupConnection(){    var error : NSError?    socket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue())    socket.bindToPort(PORT, error: &error)    socket.connectToHost(SERVER_IP, onPort: PORT, error: &error)    socket.beginReceiving(&error)    send("ping")}func send(message:String){   let data = message.dataUsingEncoding(NSUTF8StringEncoding)   socket.sendData(data, withTimeout: 2, tag: 0)}


Apple Swift version 4.2.1 Well Tested UDP Example:-

STEP 1 :- pod 'CocoaAsyncSocket'

STEP 2 :- import CocoaAsyncSocket in your UIViewController.

STEP 3 :- UIViewController

        import UIKitimport CocoaAsyncSocketclass ViewController: UIViewController {    @IBOutlet weak var btnOnOff: LightButton!    @IBOutlet weak var lblStatus: UILabel!    var inSocket : InSocket!    var outSocket : OutSocket!    override func viewDidLoad() {        super.viewDidLoad()        lblStatus.isHidden = true        inSocket = InSocket()        outSocket = OutSocket()        outSocket.setupConnection {            self.lblStatus.isHidden = false        }    }    @IBAction func btnLight(_ sender: Any) {        let signal:Signal = Signal()        self.outSocket.send(signal: signal)    }}

STEP 4 :- Reciving Socket

       //Reciving End...class InSocket: NSObject, GCDAsyncUdpSocketDelegate {   //let IP = "10.123.45.2"    let IP = "127.0.0.1"    let PORT:UInt16 = 5001    var socket:GCDAsyncUdpSocket!    override init(){        super.init()        setupConnection()    }    func setupConnection(){        socket = GCDAsyncUdpSocket(delegate: self, delegateQueue:DispatchQueue.main)        do { try socket.bind(toPort: PORT)} catch { print("")}        do { try socket.enableBroadcast(true)} catch { print("not able to brad cast")}        do { try socket.joinMulticastGroup(IP)} catch { print("joinMulticastGroup not proceed")}        do { try socket.beginReceiving()} catch { print("beginReceiving not proceed")}    }    //MARK:-GCDAsyncUdpSocketDelegate    func udpSocket(_ sock: GCDAsyncUdpSocket, didReceive data: Data, fromAddress address: Data, withFilterContext filterContext: Any?) {          print("incoming message: \(data)");          let signal:Signal = Signal.unarchive(d: data)          print("signal information : \n first \(signal.firstSignal) , second \(signal.secondSignal) \n third \(signal.thirdSignal) , fourth \(signal.fourthSignal)")            }    func udpSocket(_ sock: GCDAsyncUdpSocket, didNotConnect error: Error?) {    }        func udpSocketDidClose(_ sock: GCDAsyncUdpSocket, withError error: Error?) {    }}

STEP 5 :- Sending Socket..

//Sending End...class OutSocket: NSObject, GCDAsyncUdpSocketDelegate {    // let IP = "10.123.45.1"    let IP = "127.0.0.1"    let PORT:UInt16 = 5001    var socket:GCDAsyncUdpSocket!    override init(){        super.init()            }    func setupConnection(success:(()->())){        socket = GCDAsyncUdpSocket(delegate: self, delegateQueue:DispatchQueue.main)          do { try socket.bind(toPort: PORT)} catch { print("")}          do { try socket.connect(toHost:IP, onPort: PORT)} catch { print("joinMulticastGroup not proceed")}          do { try socket.beginReceiving()} catch { print("beginReceiving not proceed")}        success()    }    func send(signal:Signal){        let signalData = Signal.archive(w: signal)        socket.send(signalData, withTimeout: 2, tag: 0)    }    //MARK:- GCDAsyncUdpSocketDelegate    func udpSocket(_ sock: GCDAsyncUdpSocket, didConnectToAddress address: Data) {        print("didConnectToAddress");    }    func udpSocket(_ sock: GCDAsyncUdpSocket, didNotConnect error: Error?) {        if let _error = error {            print("didNotConnect \(_error )")        }    }    func udpSocket(_ sock: GCDAsyncUdpSocket, didNotSendDataWithTag tag: Int, dueToError error: Error?) {          print("didNotSendDataWithTag")    }    func udpSocket(_ sock: GCDAsyncUdpSocket, didSendDataWithTag tag: Int) {        print("didSendDataWithTag")    }}

STEP 6 :- Your Signal Data which you will Send/Recieve

import Foundationstruct Signal {    var firstSignal:UInt16 = 20    var secondSignal:UInt16 = 30    var thirdSignal: UInt16  = 40    var fourthSignal: UInt16 = 50    static func archive(w:Signal) -> Data {        var fw = w        return Data(bytes: &fw, count: MemoryLayout<Signal>.stride)    }    static func unarchive(d:Data) -> Signal {        guard d.count == MemoryLayout<Signal>.stride else {            fatalError("BOOM!")        }        var s:Signal?        d.withUnsafeBytes({(bytes: UnsafePointer<Signal>)->Void in            s = UnsafePointer<Signal>(bytes).pointee        })        return s!    }}