Swift udp實現根據端口號監聽廣播數據(利用GCDAsyncUdpSocket實現)


有個小需求,app需要監聽pc廣播的數據:

代碼實現思路:

使用三方庫:CocoaAsyncSocket

1、開啟udp監聽:

udpSocket.beginReceiving()

2、讀取udp的數據,包括對方設備的ip

func udpSocket(_ sock: GCDAsyncUdpSocket, didReceive data: Data, fromAddress address: Data, withFilterContext filterContext: Any?)

 

實現參考代碼:

1、申明變量

var udpSocket : GCDAsyncUdpSocket!

 

2、根據port端口開啟監聽

udpSocket = GCDAsyncUdpSocket(delegate: self, delegateQueue: DispatchQueue.main)
        do{
            try udpSocket.bind(toPort: 60001)
            try udpSocket.beginReceiving()

        }catch{
            print("bind error")
        };

其中60001是定義好的端口號

 

3、實現代理

func udpSocket(_ sock: GCDAsyncUdpSocket, didReceive data: Data, fromAddress address: Data, withFilterContext filterContext: Any?) {
        //Optional("{\"Port\":61312,\"LPort\":61313,\"HostName\":\"Lucifer-PC\"}")"
        
        var hostname = [CChar].init(repeating: 0, count: Int(NI_MAXHOST))
        do{
            try address.withUnsafeBytes({ (pointer:UnsafePointer<sockaddr>) -> Void in
                guard getnameinfo(pointer, socklen_t(data.count), &hostname, socklen_t(hostname.count), nil, 0, NI_NUMERICHOST) == 0 else{
                    throw NSError(domain: "domain", code: 0, userInfo: ["error":"unable to get ip address"])
                }
            })
        }catch(let error){
            print(error.localizedDescription)
        }
        var newAddress = String.init(cString: hostname)
        let addArry = newAddress.components(separatedBy: ":")
        if addArry.count > 1 {
            newAddress = addArry[addArry.count-1]
        }
        print("IP:\(newAddress)")
        
        
        let dict = data.toDictionary()  //data轉字典
        if let _port = dict["Port"] as? Int,let _lport = dict["LPort"] as? Int, let _name = dict["HostName"] as? String{
            //根據廣播的信息,構造模型
            let model = SocketConnectModel(_ip: newAddress, _port: _port, _lport: _lport, _hostName: _name, _isconnect: false)
            addWifiArry(model: model)
            
        }
        
    }

這里解釋一下:

一般情況下,我們可能只需要得到廣播的內容就足夠,也就是上面的 didReceive data: Data,我們直接將data轉換我們需要的格式即可。

我這里比較特殊,還需要知道對方設備的ip,所以需要對 fromAddress address: Data,處理。

 

4、結束監聽

udpSocket?.close()

退出頁面,或需要結束時,記得調用close方法。

 

enjoy~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM