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: )
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: , 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, , NI_NUMERICHOST) == else{
throw NSError(domain: "domain", code: , 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 > {
newAddress = addArry[addArry.count-]
}
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~
Swift udp实现根据端口号监听广播数据(利用GCDAsyncUdpSocket实现)的更多相关文章
- linux查看端口号监听状态
lsof -i:<port> netstat -tunlp | grep <port>
- IBM Domino 9 出现 Server Controller 未在主机上运行或未在端口2050监听 解决方案
如果在网上搜索的方法,比如防火墙开端口还没有解决的话,那么我的解决方案可能会解决你的问题. 出现的场景: 我先装了Notes,Designer,后装Domino Server, 配置Domino服务器 ...
- 普通用户从非80端口启动tomcat,通过端口转发监听80端口
linux下小于1024的端口都需要root去绑定. root权限启动tomcat是不明智的,可以使用非root权限启动tomcat监听8080端口,然后利用端口转发实现对80端口的监听. 端口转发: ...
- nc临时开启端口并监听
port="6379 3306 27017 4505 4506 24007 24008 49152" #while true #do for i in $port do isexi ...
- 从Wireshark监听的数据中提取需要的数据
最近,需要将wireshark监听的数据进行提取,分两步:首先,应该得出wireshark的数据包吧,在图形化界面中可以非常直观的将监听数据进行存储,但是这样需要手动操作非常麻烦,而且容易出错(随着处 ...
- Android 监听短信(同时监听广播和数据库)
暗扣,强烈谴责这种侵害用户利益的行为... 下面给大家介绍Android暗扣原理....... Android4.4以下的系统玩游戏就要小心了哈 暗扣方式之一:短信订购,即监听--------拦截- ...
- vue学习-day05 -- 案例:名字合并(监听data数据的改变)
1.案例:名字合并(监听data数据的改变) 使用keyup事件监听data数据的改变 <!DOCTYPE html> <html> <head> <titl ...
- linux网络连接的查看和端口的监听
网络软件都是由客户端和服务端组成,由服务端在服务器上监听指定的端口处理接收到的数据,而客户端是向服务器端监听的端口发送数据,并由服务器端对该数据进行处理,然后将处理结果返回给客户端. 那么我们在lin ...
- mysql服务启动 但端口未监听
mysql 启动了,用 localhost 可以连接,但是用 127.0.0.1 不能连接.可能的原因是 1. mysql为了增强安全性而跳过了端口监听,查看方法: 用mysql> SHOW V ...
随机推荐
- java -d
DB_SERVER_URL="-Ddatasource.driver=oracle.jdbc.OracleDriver -Ddatasource.url=jdbc:oracle:thin:@ ...
- Codeforces 490F Treeland Tour 树形dp
Treeland Tour 离散化之后, 每个节点维护上升链和下降链, 感觉复杂度有点高, 为啥跑这么快.. #include<bits/stdc++.h> #define LL long ...
- Codeforces Round #467 (Div. 2) E -Lock Puzzle
Lock Puzzle 题目大意:给你两个字符串一个s,一个t,长度<=2000,要求你进行小于等于6100次的shift操作,将s变成t, shift(x)表示将字符串的最后x个字符翻转后放到 ...
- k8s 环境搭建
转自:https://blog.csdn.net/running_free/article/details/78388948 一.概述 1.简介 官方中文文档:https://www.kubernet ...
- 非常可乐 HDU1495
BFS题 一共有六种状态转移 一一枚举就好 设置一个标记数组. 用二重循环可以很清晰的解决代码长的问题 #include<cstdio> #include<cstring> # ...
- 094实战 关于js SDK的程序,java SDK的程序
一:JS SDK 1.修改配置workspace 2.导入 3.Demo.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Trans ...
- java注解的概念理解
1. 注解(标注)概念:从字面意思理解是对被标注的对象(类,接口,枚举,注解类,方法,参数)的一个标记,有这个标记有什么用呢?就像学习中“划重点”的方式一样,被标记的对象肯定是特殊需要特别关照的对象, ...
- VB.NET只允许打开一个实例
If UBound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName)) ...
- 老菜鸟学习:Javascript 将html转成pdf
起因:处理某个项目,需要把页面上的数据(订单.运单)等导出pdf. 第一个想法:从 Java 层去想.但是经过各种资料查询和实践,第一个想法宣告放弃: 幸好客户的要求是:导出的 pdf 尺寸要和打印的 ...
- Problem C: 找气球
Description zstu集训队经常举办月赛,但是气球经常不够.现有多个桶,每个桶有一种颜色,每个桶可能对应多个题,给定每个题对应的桶,打比赛的时候,经常某道题被发现是水题,但是该颜色的气球没有 ...