Swift UDP连接发送正常,receiveMessage抛出连接拒绝错误求解决
问题代码
func send(_ payload: Data) { connection!.send(content: payload, completion: .contentProcessed({ sendError in if let error = sendError { NSLog("Unable to process and send the data: \(error)") } else { NSLog("Data has been sent") connection!.receiveMessage { (data, context, isComplete, error) in if(isComplete){ guard let myData = data else { return } NSLog("Received message: " + String(decoding: myData, as: UTF8.self)) }else{ NSLog("XYITA") } } } })) }
问题现象
UDP连接状态正常,connection.send可正常执行,但调用connection.receiveMessage时抛出底层错误:
[connection] nw_socket_get_input_frames [C1:1] recvmsg(fd 17, 9216 bytes) [61: Connection refused]
排查及解决建议
验证服务端响应能力
用nc -u <服务端IP> <端口>手动发送测试数据,确认是否能收到服务端回复。如果手动也收不到,说明问题在服务端:可能是服务端未绑定目标端口、防火墙拦截了响应数据包、服务端逻辑未处理UDP请求并返回数据。检查本地端口与连接状态
用lsof -i :<本地端口>查看端口占用情况,确保本地用于接收的端口未被其他进程占用;同时在调用receiveMessage前,确认connection的状态确实为ready,避免在连接未完全就绪时触发接收逻辑。补全错误处理逻辑
当前代码未处理receiveMessage回调的error参数,建议先捕获并打印该错误,获取更具象的错误信息:connection!.receiveMessage { (data, context, isComplete, error) in if let error = error { NSLog("Receive detailed error: \(error)") return } // 原有接收逻辑 }核对NWConnection配置
确认初始化connection时的NWParameters配置正确:UDP模式下是否开启了必要的选项(如广播/多播权限,若涉及这类场景),是否指定了正确的服务端地址与端口。检查App网络权限
确认Info.plist中已配置必要的网络权限:如涉及本地局域网通信,需添加NSLocalNetworkUsageDescription;若访问非HTTPS服务,需配置NSAppTransportSecurity的例外规则。考虑UDP协议特性
虽然报错是"Connection refused"(偏向目标端主动拒绝),但UDP本身无连接、不保证交付,也需排查服务端是否因请求格式错误、超时等原因未生成响应,或响应数据包在网络传输中丢失。
内容的提问来源于stack exchange,提问作者LNxD

