From 3225d8fa17d7028e81b16e2c3470cec61bac926e Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Tue, 5 May 2026 14:53:16 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=94=9F=E5=91=BD=E5=91=A8?= =?UTF-8?q?=E6=9C=9F=E7=9A=84=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tun/Punchnet/Actors/SDLContextActor.swift | 131 ++++++++++++++-------- 1 file changed, 85 insertions(+), 46 deletions(-) diff --git a/Tun/Punchnet/Actors/SDLContextActor.swift b/Tun/Punchnet/Actors/SDLContextActor.swift index 30c1a56..b134614 100644 --- a/Tun/Punchnet/Actors/SDLContextActor.swift +++ b/Tun/Punchnet/Actors/SDLContextActor.swift @@ -56,19 +56,23 @@ actor SDLContextActor { // 依赖的变量 private var udpHole: SDLUDPHole? + private var udpHoleMonitorTask: Task? private var udpHoleLocalAddress: SocketAddress? private var udpHoleV6: SDLUDPHoleV6? // dns的client对象 private var dnsClient: DNSCloudClient? - + private var dnsMonitorTask: Task? + // Localdns的client对象 private let publicDnsServers = ["223.5.5.5", "119.29.29.29"] private var dnsLocalClient: DNSLocalClient? + private var dnsLocalMonitorTask: Task? private var quicClient: SDLQUICClient? - + private var superMonitorTask: Task? + nonisolated private let puncherActor: SDLPuncherActor // 网络探测对象 nonisolated private let proberActor: SDLNATProberActor @@ -88,9 +92,6 @@ actor SDLContextActor { // 流量统计 nonisolated private let flowTracer = SDLFlowTracer() - // 处理内部的需要长时间运行的任务 - private var supervisor = SDLSupervisor() - nonisolated private let provider: NEPacketTunnelProvider // 处理权限控制 @@ -130,36 +131,11 @@ actor SDLContextActor { await self.puncherActor.start() await self.arpServer.start() - await self.supervisor.addWorker(name: "dnsClient") { - SDLLogger.log("[SDLContext] dnsClient running!!!!") - try await self.startDnsClient() - SDLLogger.log("[SDLContext] dnsClient closed!!!!") - } + self.startDnsMonitor() + self.startDnsLocalMonitor() - await self.supervisor.addWorker(name: "dnsLocalClient") { - SDLLogger.log("[SDLContext] dnsLocalClient running!!!!") - try await self.startDnsLocalClient() - SDLLogger.log("[SDLContext] dnsLocalClient closed!!!!") - } - - // 启动udp - await self.supervisor.addWorker(name: "udpHole") { - SDLLogger.log("[SDLContext] udp running!!!!") - try await self.startUDPHole() - SDLLogger.log("[SDLContext] udp closed!!!!") - } - - await self.supervisor.addWorker(name: "quicClient") { - SDLLogger.log("[SDLContext] superClient running!!!!") - try await self.startQUICClient() - SDLLogger.log("[SDLContext] superClient closed!!!!") - } - -// await self.supervisor.addWorker(name: "udpHoleV6") { -// SDLLogger.log("[SDLContext] udp v6 running!!!!") -// try await self.startUDPHoleV6() -// SDLLogger.log("[SDLContext] udp v6 closed!!!!") -// } + self.startUDPHoleMonitor() + self.startSuperMonitor() } // 取消出口节点的时候,ip地址为: 0.0.0.0 @@ -172,7 +148,19 @@ actor SDLContextActor { try await self.setNetworkSettings(config: config, dnsServer: DNSHelper.dnsServer) } - private func startQUICClient() async throws { + private func startSuperMonitor() { + guard self.superMonitorTask == nil else { + return + } + + self.superMonitorTask = self.startMonitorTask(name: "superMonitorTask") { + SDLLogger.log("[SDLContext] superClient running!!!!") + try await self.startSuperClient() + SDLLogger.log("[SDLContext] superClient stop!!!!") + } + } + + private func startSuperClient() async throws { SDLLogger.log("[SDLContext] try start quicClient", for: .debug) // 启动monitor @@ -309,6 +297,16 @@ actor SDLContextActor { SDLLogger.log("[SDLContext] tunnelAppNotifier ready") } + private func startDnsMonitor() { + guard self.dnsMonitorTask == nil else { + return + } + + self.dnsMonitorTask = self.startMonitorTask(name: "dnsMonitorTask") { + try await self.startDnsClient() + } + } + private func startDnsClient() async throws { // 启动dns服务 let dnsClient = DNSCloudClient(host: self.config.serverHost, port: 15353) @@ -332,6 +330,16 @@ actor SDLContextActor { } } + private func startDnsLocalMonitor() { + guard self.dnsLocalMonitorTask == nil else { + return + } + + self.dnsLocalMonitorTask = self.startMonitorTask(name: "dnsLocalMonitorTask") { + try await self.startDnsLocalClient() + } + } + private func startDnsLocalClient() async throws { let dnsServer = self.publicDnsServers.randomElement() ?? self.publicDnsServers[0] // 启动dns服务 @@ -362,6 +370,16 @@ actor SDLContextActor { } } + private func startUDPHoleMonitor() { + guard self.udpHoleMonitorTask == nil else { + return + } + + self.udpHoleMonitorTask = self.startMonitorTask(name: "udpHoleMonitorTask") { + try await self.startUDPHole() + } + } + private func startUDPHole() async throws { // 启动udp服务器 let udpHole = try SDLUDPHole() @@ -485,29 +503,24 @@ actor SDLContextActor { // 处理context的停止问题 public func stop() async { - await self.supervisor.stop() await self.puncherActor.stop() await self.arpServer.clear() await self.sessionManager.clear() self.flowSessionManager.clear() - self.udpHole?.stop() - self.udpHole = nil + self.udpHoleMonitorTask?.cancel() self.udpHoleLocalAddress = nil self.udpHoleV6?.stop() self.udpHoleV6 = nil - self.quicClient?.stop() - self.quicClient = nil + self.dnsMonitorTask?.cancel() + self.dnsLocalMonitorTask?.cancel() - self.dnsClient?.stop() - self.dnsClient = nil - - await self.dnsLocalClient?.stop() - self.dnsLocalClient = nil - + self.superMonitorTask?.cancel() + self.udpHoleMonitorTask?.cancel() + self.readTask?.cancel() self.readTask = nil @@ -737,6 +750,32 @@ actor SDLContextActor { } } +extension SDLContextActor { + + func startMonitorTask(name: String, _ body: @escaping () async throws -> Void, retryDelay: Duration = .seconds(5)) -> Task { + return Task(name: name) { + while true { + do { + try Task.checkCancellation() + try await body() + } catch is CancellationError { + break + } catch let err { + SDLLogger.log("[SDLContextActor] worker \(name) crashed: \(err.localizedDescription)", for: .debug) + do { + try await Task.sleep(for: retryDelay) + } catch is CancellationError { + break + } catch { + break + } + } + } + } + } + +} + // 处理和Super之间的通讯 extension SDLContextActor {