From 9f1eadeaaa029c70b38aa09fc6e57bff1c223ce6 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Sat, 9 May 2026 10:39:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B3=A8=E5=86=8C=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tun/PacketTunnelProvider.swift | 9 ++- Tun/Punchnet/Context/SDLContextActor.swift | 70 ++++++++-------------- 2 files changed, 33 insertions(+), 46 deletions(-) diff --git a/Tun/PacketTunnelProvider.swift b/Tun/PacketTunnelProvider.swift index 950e664..172c904 100644 --- a/Tun/PacketTunnelProvider.swift +++ b/Tun/PacketTunnelProvider.swift @@ -66,10 +66,15 @@ class PacketTunnelProvider: NEPacketTunnelProvider { override func sleep(completionHandler: @escaping () -> Void) { // Add code here to get ready to sleep. - self.runtimeEnv?.submitCommand(command: .stop(completion: { + guard let runtimeEnv else { + completionHandler() + return + } + + runtimeEnv.submitCommand(command: .stop(completion: { SDLLogger.log("[PacketTunnelProvider] sleep") + completionHandler() })) - completionHandler() } override func wake() { diff --git a/Tun/Punchnet/Context/SDLContextActor.swift b/Tun/Punchnet/Context/SDLContextActor.swift index a4b635e..df225b1 100644 --- a/Tun/Punchnet/Context/SDLContextActor.swift +++ b/Tun/Punchnet/Context/SDLContextActor.swift @@ -101,9 +101,6 @@ actor SDLContextActor { // Flow流会话管理, 过期时间为: 180秒 private let flowSessionManager = SDLFlowSessionManager(sessionTimeout: 180) - // 注册任务 - private var registerTask: Task? - // stunRequest任务 private var stunRequestTask: Task? @@ -157,9 +154,6 @@ actor SDLContextActor { self.flowSessionManager.clear() - self.registerTask?.cancel() - self.registerTask = nil - self.stunRequestTask?.cancel() self.stunRequestTask = nil @@ -245,42 +239,24 @@ extension SDLContextActor { switch message { case .welcome(let welcome): SDLLogger.log("[SDLContext] quic welcome: \(welcome)") + + await self.ipv6AssistClient?.stop() + self.ipv6AssistClient = nil + // 尝试创建v6地址的辅助探测器 + if welcome.hasIpv6Assist { + self.ipv6AssistClient = SDLIPV6AssistClient(assistServerInfo: welcome.ipv6Assist) + await self.ipv6AssistClient?.start() + } + // 注册 await self.doRegisterSuper() SDLLogger.log("[SDLContext] quic doRegisterSuper") - - // 任务取消机制 - self.registerTask = Task { - do { - try await Task.sleep(for: .seconds(5)) - try Task.checkCancellation() - - // 关闭掉当前Tunnel - self.publishTunnelEvent(message: "校验失败") - // 报告错误并退出 - let error = NSError(domain: "com.jihe.punchnet.tun", code: -3) - self.provider.cancelTunnelWithError(error) - } catch { - SDLLogger.log("[SDLContext] registerTask: cancel") - return - } - } - - // 启动stun任务 - await self.startStunRequestTask(welcome: welcome) - case .pong: //SDLLogger.shared.log("[SDLContext] quic pong") () case .registerSuperAck(let registerSuperAck): - self.registerTask?.cancel() - self.registerTask = nil - await self.handleRegisterSuperAck(registerSuperAck: registerSuperAck) case .registerSuperNak(let registerSuperNak): - self.registerTask?.cancel() - self.registerTask = nil - self.handleRegisterSuperNak(nakPacket: registerSuperNak) case .peerInfo(let peerInfo): SDLLogger.log("[SDLContext] peer message: \(peerInfo)") @@ -360,6 +336,9 @@ extension SDLContextActor { SDLLogger.log("[SDLContext] updatePolicyTask stop with err: \(err)") } } + + // 启动stun任务 + await self.startStunRequestTask() } private func handleRegisterSuperNak(nakPacket: SDLRegisterSuperNak) { @@ -551,16 +530,10 @@ extension SDLContextActor { extension SDLContextActor { // MARK: -- StunRequestTask - private func startStunRequestTask(welcome: SDLWelcome) async { + private func startStunRequestTask() async { self.stunRequestTask?.cancel() self.stunRequestTask = nil - await self.ipv6AssistClient?.stop() - self.ipv6AssistClient = SDLIPV6AssistClient(assistServerInfo: welcome.ipv6Assist) - await self.ipv6AssistClient?.start() - let ipv6AssistClient = self.ipv6AssistClient - - // 通过 welcome信息拿到当前可用使用的ipv6地址 // 处理心跳逻辑 self.stunRequestTask = Task { [weak self] in let timerStream = SDLAsyncTimerStream() @@ -570,21 +543,30 @@ extension SDLContextActor { if Task.isCancelled { break } + + let probeReply = try? await self?.ipv6AssistClient?.probe(requestTimeout: .seconds(3)) + if Task.isCancelled { + break + } - let probeReply = try? await ipv6AssistClient?.probe(requestTimeout: .seconds(3)) if let v6Info = probeReply?.v6Info, let v6Address = SDLUtil.ipv6DataToString(v6Info.v6) { SDLLogger.log("[SDLContext] probe ipv6 address: \(v6Address)") } else { SDLLogger.log("[SDLContext] probe ipv6 address: empty") } - await self?.sendStunRequest(probeReply: probeReply) + + if Task.isCancelled { + break + } + + await self?.sendStunRequest(v6Info: probeReply?.v6Info) } SDLLogger.log("[SDLContext] udp stunRequestTask cancel") } } - private func sendStunRequest(probeReply: SDLV6AssistProbeReply?) async { + private func sendStunRequest(v6Info: SDLV6Info?) async { guard let sessionToken = self.sessionToken else { return } @@ -597,7 +579,7 @@ extension SDLContextActor { stunRequest.natType = UInt32(self.natType.rawValue) stunRequest.sessionToken = sessionToken - if let v6Info = probeReply?.v6Info { + if let v6Info { stunRequest.v6Info = v6Info }