• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Swiftudp实现根据端口号监听广播数据(利用GCDAsyncUdpSocket实现) ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

有个小需求,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~

 

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap