From 358e555666946698789edf958ac6c3fb48ce69d0 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Wed, 6 May 2026 22:24:56 +0800 Subject: [PATCH] fix SDLUDPHole --- Tun/Punchnet/Context/SDLContextActor.swift | 31 +++++++++++++--------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/Tun/Punchnet/Context/SDLContextActor.swift b/Tun/Punchnet/Context/SDLContextActor.swift index fc6426f..690443c 100644 --- a/Tun/Punchnet/Context/SDLContextActor.swift +++ b/Tun/Punchnet/Context/SDLContextActor.swift @@ -111,7 +111,7 @@ actor SDLContextActor { private var ipv6AssistClient: SDLIPV6AssistClient? // 数据包读取任务 - private var readTask: Task<(), Never>? + private var readTask: Task? private let sessionManager = SessionManager() nonisolated private let arpServer: ArpServer @@ -212,6 +212,7 @@ actor SDLContextActor { self.superMonitorTask = nil await superClient?.stop() + SDLLogger.log("[SDLContext] try to cancel readTask") self.readTask?.cancel() self.readTask = nil @@ -937,26 +938,30 @@ extension SDLContextActor { // 开始读取数据, 用单独的线程处理packetFlow private func startReader() { - // 停止之前的任务 self.readTask?.cancel() - // 开启新的任务 let provider = self.provider - self.readTask = Task(priority: .high) { - repeat { + self.readTask = Task(priority: .high) { [weak self] in + try await withTaskCancellationHandler { do { - try Task.checkCancellation() - let (packets, numbers) = await provider.packetFlow.readPackets() - try Task.checkCancellation() - for (data, number) in zip(packets, numbers) where number == 2 { - if let ipPacket = IPPacket(data) { - await self.dealTunPacket(packet: ipPacket) + repeat { + try Task.checkCancellation() + let (packets, numbers) = await provider.packetFlow.readPackets() + try Task.checkCancellation() + for (data, number) in zip(packets, numbers) where number == 2 { + if let ipPacket = IPPacket(data) { + await self?.dealTunPacket(packet: ipPacket) + } } - } + } while true + SDLLogger.log("[SDLContext] readTask finish") } catch let err { SDLLogger.log("[SDLContext] readTask catch error: \(err)") + throw err } - } while true + } onCancel: { + SDLLogger.log("[SDLContext] readTask onCancel") + } } }