From c3752bb68802c41283c809ec2c0a21cecf36ac91 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Wed, 6 May 2026 21:55:56 +0800 Subject: [PATCH] =?UTF-8?q?fix=20context=20=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tun/Punchnet/Context/SDLContextActor.swift | 49 +++++++++---------- .../SDLHoleDataProcessor.swift | 0 .../SDLLayerPacketForwarder.swift | 0 .../SDLSuperEventProcessor.swift | 0 .../SDLTunPacketRouter.swift | 0 5 files changed, 22 insertions(+), 27 deletions(-) rename Tun/Punchnet/{Actors => Context}/SDLHoleDataProcessor.swift (100%) rename Tun/Punchnet/{Actors => Context}/SDLLayerPacketForwarder.swift (100%) rename Tun/Punchnet/{Actors => Context}/SDLSuperEventProcessor.swift (100%) rename Tun/Punchnet/{Actors => Context}/SDLTunPacketRouter.swift (100%) diff --git a/Tun/Punchnet/Context/SDLContextActor.swift b/Tun/Punchnet/Context/SDLContextActor.swift index e65b6fe..fc6426f 100644 --- a/Tun/Punchnet/Context/SDLContextActor.swift +++ b/Tun/Punchnet/Context/SDLContextActor.swift @@ -196,13 +196,14 @@ actor SDLContextActor { let dnsClient = self.dnsClient self.dnsClient = nil - let dnsLocalClient = self.dnsLocalClient - self.dnsLocalClient = nil self.dnsMonitorTask?.cancel() self.dnsMonitorTask = nil + dnsClient?.stop() + + let dnsLocalClient = self.dnsLocalClient + self.dnsLocalClient = nil self.dnsLocalMonitorTask?.cancel() self.dnsLocalMonitorTask = nil - dnsClient?.stop() await dnsLocalClient?.stop() let superClient = self.superClient @@ -277,6 +278,7 @@ extension SDLContextActor { // MARK: 数据发送 extension SDLContextActor { + // 发送给super/stun节点的数据 private func sendSuperPacket(type: SDLPacketType, data: Data) async { await self.sendPacket(type: type, data: data, remoteAddress: self.config.stunSocketAddress) @@ -323,7 +325,6 @@ extension SDLContextActor { private func startSuperClient() async throws { let superClient = SDLSuperClient(host: self.config.serverHost, port: 1443) self.superClient = superClient - await superClient.start() do { @@ -331,14 +332,11 @@ extension SDLContextActor { try await runSuperClient(superClient) } onCancel: { SDLLogger.log("[SDLContext] startSuperClient onCancel", for: .debug) - Task { await superClient.stop() } } - await cleanupSuperClient(superClient) - } catch { await cleanupSuperClient(superClient) SDLLogger.log("[SDLContext] startSuperClient catch err: \(error)") @@ -688,8 +686,6 @@ extension SDLContextActor { await self?.setNatType(natType: natType) } - SDLLogger.log("[SDLContext] udpHole ready") - do { try await withTaskCancellationHandler { for try await (remoteAddress, message) in await udpHole.messageStream() { @@ -878,6 +874,7 @@ extension SDLContextActor { // MARK: 和Stun相关的心跳机制 extension SDLContextActor { + // MARK: -- StunRequestTask private func startStunRequestTask(welcome: SDLWelcome) async { self.stunRequestTask?.cancel() @@ -890,7 +887,7 @@ extension SDLContextActor { // 通过 welcome信息拿到当前可用使用的ipv6地址 // 处理心跳逻辑 - self.stunRequestTask = Task.detached { [weak self] in + self.stunRequestTask = Task { [weak self] in let timerStream = SDLAsyncTimerStream() timerStream.start(interval: .seconds(8)) @@ -935,7 +932,7 @@ extension SDLContextActor { } } -// MARK: 处理从Tun相关的逻辑 +// MARK: NEPacketTunnelProvider相关的逻辑 extension SDLContextActor { // 开始读取数据, 用单独的线程处理packetFlow @@ -945,21 +942,19 @@ extension SDLContextActor { // 开启新的任务 let provider = self.provider - self.readTask = Task.detached(priority: .high) { [weak self] in + self.readTask = Task(priority: .high) { repeat { - if Task.isCancelled { - return - } - - let (packets, numbers) = await provider.packetFlow.readPackets() - if Task.isCancelled { - return - } - - for (data, number) in zip(packets, numbers) where number == 2 { - if let ipPacket = IPPacket(data) { - await self?.dealTunPacket(packet: ipPacket) + 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) + } } + } catch let err { + SDLLogger.log("[SDLContext] readTask catch error: \(err)") } } while true } @@ -1061,10 +1056,10 @@ extension SDLContextActor { let nePacket = NEPacket(data: ipPacketData, protocolFamily: 2) self.provider.packetFlow.writePacketObjects([nePacket]) case .cloudDNS(let name, let ipPacketData): - //SDLLogger.log("[SDLContext] get cloud dns request: \(name)") - await self.dnsClient?.forward(ipPacketData: ipPacketData) + SDLLogger.log("[SDLContext] get cloud dns request: \(name)") + self.dnsClient?.forward(ipPacketData: ipPacketData) case .localDNS(let name, let payload, let tracker): - //SDLLogger.log("[SDLContext] get local dns request: \(name)") + SDLLogger.log("[SDLContext] get local dns request: \(name)") await self.dnsLocalClient?.query(tracker: tracker, dnsPayload: payload) case .forwardToNextHop(let ip, let type, let data, let kind): await self.forwardPacketToNextHop(ip: ip, type: type, data: data, kind: kind) diff --git a/Tun/Punchnet/Actors/SDLHoleDataProcessor.swift b/Tun/Punchnet/Context/SDLHoleDataProcessor.swift similarity index 100% rename from Tun/Punchnet/Actors/SDLHoleDataProcessor.swift rename to Tun/Punchnet/Context/SDLHoleDataProcessor.swift diff --git a/Tun/Punchnet/Actors/SDLLayerPacketForwarder.swift b/Tun/Punchnet/Context/SDLLayerPacketForwarder.swift similarity index 100% rename from Tun/Punchnet/Actors/SDLLayerPacketForwarder.swift rename to Tun/Punchnet/Context/SDLLayerPacketForwarder.swift diff --git a/Tun/Punchnet/Actors/SDLSuperEventProcessor.swift b/Tun/Punchnet/Context/SDLSuperEventProcessor.swift similarity index 100% rename from Tun/Punchnet/Actors/SDLSuperEventProcessor.swift rename to Tun/Punchnet/Context/SDLSuperEventProcessor.swift diff --git a/Tun/Punchnet/Actors/SDLTunPacketRouter.swift b/Tun/Punchnet/Context/SDLTunPacketRouter.swift similarity index 100% rename from Tun/Punchnet/Actors/SDLTunPacketRouter.swift rename to Tun/Punchnet/Context/SDLTunPacketRouter.swift