zoukankan      html  css  js  c++  java
  • 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~

     
  • 相关阅读:
    自定义异常
    this()和super()的区别
    Eclipse快速创建函数
    Eclipse的.java文件有蓝色三角符号
    可变数量参数
    近期的目标
    怎么在电脑右键的新建里面添加.md文件
    数组的排序(从小到大)
    Arrays类
    不用乘法计算乘法(快速计算)
  • 原文地址:https://www.cnblogs.com/yajunLi/p/8182547.html
Copyright © 2011-2022 走看看