博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift udp实现根据端口号监听广播数据(利用GCDAsyncUdpSocket实现)
阅读量:5255 次
发布时间:2019-06-14

本文共 2219 字,大约阅读时间需要 7 分钟。

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

 

转载于:https://www.cnblogs.com/yajunLi/p/8182547.html

你可能感兴趣的文章
Ubuntu(虚拟机)下安装Qt5.5.1
查看>>
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
查看>>
java 常用命令
查看>>
CodeForces Round #545 Div.2
查看>>
卷积中的参数
查看>>
51nod1076 (边双连通)
查看>>
Item 9: Avoid Conversion Operators in Your APIs(Effective C#)
查看>>
深入浅出JavaScript(2)—ECMAScript
查看>>
STEP2——《数据分析:企业的贤内助》重点摘要笔记(六)——数据描述
查看>>
ViewPager的onPageChangeListener里面的一些方法参数:
查看>>
Jenkins关闭、重启,Jenkins服务的启动、停止方法。
查看>>
CF E2 - Array and Segments (Hard version) (线段树)
查看>>
Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
查看>>
SIGPIPE并产生一个信号处理
查看>>
CentOS
查看>>
Linux pipe函数
查看>>
java equals 小记
查看>>
爬虫-通用代码框架
查看>>
2019春 软件工程实践 助教总结
查看>>
YUV 格式的视频呈现
查看>>