From 0fe9b43c087b5dacb6cb24fea347dee86b86ac3f Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Fri, 1 Aug 2025 23:37:19 +0800 Subject: [PATCH] fix context --- Sources/Punchnet/SDLContext.swift | 54 +++++++++++++++++-------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/Sources/Punchnet/SDLContext.swift b/Sources/Punchnet/SDLContext.swift index deb52f1..a023673 100644 --- a/Sources/Punchnet/SDLContext.swift +++ b/Sources/Punchnet/SDLContext.swift @@ -78,6 +78,7 @@ public class SDLContext: @unchecked Sendable { // 处理holer private var holerPublishers: [Data:PassthroughSubject] = [:] private var bag = Set() + private var locker = NSLock() struct RegisterRequest { let srcMac: Data @@ -492,7 +493,7 @@ public class SDLContext: @unchecked Sendable { else { // 构造arp请求 let broadcastMac = Data([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]) - let arpReqeust: ARPPacket = ARPPacket.arpRequest(senderIP: self.devAddr.netAddr, senderMAC: self.devAddr.mac, targetIP: dstIp) + let arpReqeust = ARPPacket.arpRequest(senderIP: self.devAddr.netAddr, senderMAC: self.devAddr.mac, targetIP: dstIp) await self.routeLayerPacket(dstMac: broadcastMac, type: .arp, data: arpReqeust.marshal()) NSLog("[SDLContext] dstIp: \(dstIp) arp query not found") @@ -528,19 +529,26 @@ public class SDLContext: @unchecked Sendable { // 尝试打洞 let registerRequest = RegisterRequest(srcMac: self.devAddr.mac, dstMac: dstMac, networkId: self.devAddr.networkID) - self.submitRegisterRequest(dstMac: dstMac, request: registerRequest) - + self.submitRegisterRequest(request: registerRequest) } } - private func submitRegisterRequest(dstMac: Data, request: RegisterRequest) { + private func submitRegisterRequest(request: RegisterRequest) { + self.locker.lock() + defer { + self.locker.unlock() + } + + let dstMac = request.dstMac if let publisher = self.holerPublishers[dstMac] { publisher.send(request) } else { let publisher = PassthroughSubject() publisher.debounce(for: .seconds(5), scheduler: DispatchQueue.global()) .sink { request in - self.tryHole(request: request) + Task { + await self.tryHole(request: request) + } } .store(in: &self.bag) @@ -548,26 +556,24 @@ public class SDLContext: @unchecked Sendable { } } - private func tryHole(request: RegisterRequest) { - Task { - guard let message = try? await self.superClient?.queryInfo(dst_mac: request.dstMac).get() else { - return - } - - switch message.packet { - case .empty: - SDLLogger.log("[SDLContext] hole query_info get empty: \(message)", level: .debug) - case .peerInfo(let peerInfo): - if let remoteAddress = peerInfo.v4Info.socketAddress() { - SDLLogger.log("[SDLContext] hole sock address: \(remoteAddress)", level: .warning) - // 发送register包 - await self.udpHole?.sendRegister(remoteAddress: remoteAddress, networkId: request.networkId, srcMac: request.srcMac, dst_mac: request.dstMac) - } else { - SDLLogger.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning) - } - default: - SDLLogger.log("[SDLContext] hole query_info is packet: \(message)", level: .warning) + private func tryHole(request: RegisterRequest) async { + guard let message = try? await self.superClient?.queryInfo(dst_mac: request.dstMac).get() else { + return + } + + switch message.packet { + case .empty: + SDLLogger.log("[SDLContext] hole query_info get empty: \(message)", level: .debug) + case .peerInfo(let peerInfo): + if let remoteAddress = peerInfo.v4Info.socketAddress() { + SDLLogger.log("[SDLContext] hole sock address: \(remoteAddress)", level: .warning) + // 发送register包 + await self.udpHole?.sendRegister(remoteAddress: remoteAddress, networkId: request.networkId, srcMac: request.srcMac, dst_mac: request.dstMac) + } else { + SDLLogger.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning) } + default: + SDLLogger.log("[SDLContext] hole query_info is packet: \(message)", level: .warning) } }