From af6b51096b36a45477fadded69372942a14700a2 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Wed, 20 May 2026 15:25:40 +0800 Subject: [PATCH] fix udpHoleServiceProxy --- Tun/Punchnet/Context/SDLContextActor.swift | 12 ++++---- Tun/Punchnet/UDPHole/SDLUDPHoleService.swift | 29 ++++++++++++++++++++ 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/Tun/Punchnet/Context/SDLContextActor.swift b/Tun/Punchnet/Context/SDLContextActor.swift index 7c60f51..1281359 100644 --- a/Tun/Punchnet/Context/SDLContextActor.swift +++ b/Tun/Punchnet/Context/SDLContextActor.swift @@ -68,10 +68,10 @@ actor SDLContextActor { // 加密算法相关 nonisolated let rsaCipher: RSACipher - private var udpHoleService: SDLUDPHoleService? private var dnsService: SDLDNSService? private var packetReaderService: SDLPacketReaderService? private let superServiceProxy = SDLSuperServiceProxy() + private let udpHoleServiceProxy = SDLUDPHoleServiceProxy() private let publicDnsServers = ["223.5.5.5", "119.29.29.29"] @@ -130,7 +130,7 @@ actor SDLContextActor { let udpHoleService = SDLUDPHoleService(proberActor: self.proberActor) { [weak self] event in await self?.handleUDPHoleEvent(event) } - self.udpHoleService = udpHoleService + await self.udpHoleServiceProxy.replace(udpHoleService) await udpHoleService.start(includeV6: false) let superService = SDLSuperService(host: self.config.serverHost) { [weak self] message in @@ -157,9 +157,7 @@ actor SDLContextActor { self.packetReaderService = nil await packetReaderService?.stop() - let udpHoleService = self.udpHoleService - self.udpHoleService = nil - await udpHoleService?.stop() + await self.udpHoleServiceProxy.stop() let dnsService = self.dnsService self.dnsService = nil @@ -219,7 +217,7 @@ extension SDLContextActor { } private func sendPacket(type: SDLPacketType, data: Data, remoteAddress: SocketAddress) async { - await self.udpHoleService?.send(type: type, data: data, remoteAddress: remoteAddress) + await self.udpHoleServiceProxy.send(type: type, data: data, remoteAddress: remoteAddress) } } @@ -253,7 +251,7 @@ extension SDLContextActor { SDLLogger.log("[SDLContext] peer message: \(peerInfo)") let packets = await self.puncherActor.makeRegisterPackets(peerInfo: peerInfo) for packet in packets { - await self.udpHoleService?.send(type: .register, data: packet.data, remoteAddress: packet.remoteAddress) + await self.udpHoleServiceProxy.send(type: .register, data: packet.data, remoteAddress: packet.remoteAddress) } case .event(let event): await self.handleEvent(event: event) diff --git a/Tun/Punchnet/UDPHole/SDLUDPHoleService.swift b/Tun/Punchnet/UDPHole/SDLUDPHoleService.swift index d7a40bb..a9c1eb6 100644 --- a/Tun/Punchnet/UDPHole/SDLUDPHoleService.swift +++ b/Tun/Punchnet/UDPHole/SDLUDPHoleService.swift @@ -238,3 +238,32 @@ actor SDLUDPHoleService { } } } + +actor SDLUDPHoleServiceProxy { + private var udpHoleService: SDLUDPHoleService? + private var generation: UInt64 = 0 + + func replace(_ udpHoleService: SDLUDPHoleService?) async { + self.generation &+= 1 + + let oldUDPHoleService = self.udpHoleService + self.udpHoleService = udpHoleService + + if oldUDPHoleService !== udpHoleService { + await oldUDPHoleService?.stop() + } + } + + func stop() async { + self.generation &+= 1 + + let udpHoleService = self.udpHoleService + self.udpHoleService = nil + + await udpHoleService?.stop() + } + + func send(type: SDLPacketType, data: Data, remoteAddress: SocketAddress) async { + await self.udpHoleService?.send(type: type, data: data, remoteAddress: remoteAddress) + } +}