diff --git a/Tun/Punchnet/Actors/SDLContextActor.swift b/Tun/Punchnet/Actors/SDLContextActor.swift index 6757622..9448d71 100644 --- a/Tun/Punchnet/Actors/SDLContextActor.swift +++ b/Tun/Punchnet/Actors/SDLContextActor.swift @@ -57,6 +57,7 @@ actor SDLContextActor { // 依赖的变量 private var udpHole: SDLUDPHole? private var udpHoleMonitorTask: Task? + private var natProbeTask: Task? private var udpHoleLocalAddress: SocketAddress? private var udpHoleV6: SDLUDPHoleV6? @@ -381,9 +382,15 @@ actor SDLContextActor { } // 开始探测nat的类型 - Task { + self.natProbeTask?.cancel() + let proberActor = self.proberActor + self.natProbeTask = Task { [weak self] in SDLLogger.log("[SDLContext] start probeNatType") - await self.probeNatType() + let natType = await proberActor.probeNatType(using: udpHole) + if Task.isCancelled { + return + } + await self?.setNatType(natType: natType) } SDLLogger.log("[SDLContext] udpHole ready") @@ -499,11 +506,21 @@ actor SDLContextActor { self.udpHoleMonitorTask?.cancel() self.udpHoleMonitorTask = nil + self.natProbeTask?.cancel() + self.natProbeTask = nil udpHoleV6?.stop() await udpHole?.stop() + let dnsClient = self.dnsClient + self.dnsClient = nil + let dnsLocalClient = self.dnsLocalClient + self.dnsLocalClient = nil self.dnsMonitorTask?.cancel() + self.dnsMonitorTask = nil self.dnsLocalMonitorTask?.cancel() + self.dnsLocalMonitorTask = nil + dnsClient?.stop() + await dnsLocalClient?.stop() let quicClient = self.quicClient self.quicClient = nil @@ -564,10 +581,11 @@ actor SDLContextActor { await self.ipv6AssistClient?.stop() self.ipv6AssistClient = SDLIPV6AssistClient(assistServerInfo: welcome.ipv6Assist) await self.ipv6AssistClient?.start() + let ipv6AssistClient = self.ipv6AssistClient // 通过 welcome信息拿到当前可用使用的ipv6地址 // 处理心跳逻辑 - self.stunRequestTask = Task.detached { + self.stunRequestTask = Task.detached { [weak self] in let timerStream = SDLAsyncTimerStream() timerStream.start(interval: .seconds(8)) @@ -576,13 +594,13 @@ actor SDLContextActor { break } - let probeReply = try? await self.ipv6AssistClient?.probe(requestTimeout: .seconds(3)) + 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) + await self?.sendStunRequest(probeReply: probeReply) } SDLLogger.log("[SDLContext] udp stunRequestTask cancel") @@ -617,16 +635,21 @@ actor SDLContextActor { self.readTask?.cancel() // 开启新的任务 - self.readTask = Task.detached(priority: .high) { + let provider = self.provider + self.readTask = Task.detached(priority: .high) { [weak self] in repeat { if Task.isCancelled { return } - let (packets, numbers) = await self.provider.packetFlow.readPackets() + 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) + await self?.dealTunPacket(packet: ipPacket) } } } while true @@ -741,6 +764,7 @@ actor SDLContextActor { self.udpHoleLocalAddress = nil self.udpHoleV6 = nil self.dnsClient = nil + SDLLogger.log("[SDLContext] deinit", for: .debug) } } diff --git a/Tun/Punchnet/SDLAsyncTimerStream.swift b/Tun/Punchnet/SDLAsyncTimerStream.swift index 5e43a1e..03f9fbe 100644 --- a/Tun/Punchnet/SDLAsyncTimerStream.swift +++ b/Tun/Punchnet/SDLAsyncTimerStream.swift @@ -19,13 +19,14 @@ class SDLAsyncTimerStream { func start(interval: DispatchTimeInterval) { timer.schedule(deadline: .now(), repeating: interval) - timer.setEventHandler { - self.cont.yield() + timer.setEventHandler { [weak self] in + self?.cont.yield() } timer.resume() } deinit { + self.cont.finish() self.timer.cancel() }