diff --git a/Tun/Punchnet/Actors/SDLContextActor.swift b/Tun/Punchnet/Actors/SDLContextActor.swift index bc6439a..fad6af7 100644 --- a/Tun/Punchnet/Actors/SDLContextActor.swift +++ b/Tun/Punchnet/Actors/SDLContextActor.swift @@ -175,23 +175,8 @@ actor SDLContextActor { } } - // 处理心跳逻辑 - let pingTask = Task.detached { - let timerStream = SDLAsyncTimerStream() - timerStream.start(interval: .seconds(5)) - - for await _ in timerStream.stream { - if Task.isCancelled { - break - } - quicClient.send(type: .ping, data: Data()) - } - - SDLLogger.shared.log("[SDLContext] udp pingTask cancel") - } - self.quicClient = quicClient - self.quicWorkers = [messageTask, pingTask] + self.quicWorkers = [messageTask] return quicClient } diff --git a/Tun/Punchnet/Actors/SDLQuicClient.swift b/Tun/Punchnet/Actors/SDLQuicClient.swift index 8180a1c..8cf80fa 100644 --- a/Tun/Punchnet/Actors/SDLQuicClient.swift +++ b/Tun/Punchnet/Actors/SDLQuicClient.swift @@ -28,6 +28,7 @@ final class SDLQUICClient { public var messageStream: AsyncStream private let messageCont: AsyncStream.Continuation private var readTask: Task? + private var pingTask: Task? private let connection: NWConnection private let queue = DispatchQueue(label: "com.sdl.QUICClient.queue") // 专用队列保证线程安全 @@ -58,7 +59,7 @@ final class SDLQUICClient { func start() { connection.stateUpdateHandler = { state in - SDLLogger.shared.log("[SDLQUICTransport] new state: \(state)") + SDLLogger.shared.log("[SDLQUICClient] new state: \(state)") switch state { case .ready: self.readyCont.yield() @@ -103,6 +104,20 @@ final class SDLQUICClient { } } + // 处理心跳逻辑 + self.pingTask = Task { + let timerStream = SDLAsyncTimerStream() + timerStream.start(interval: .seconds(5)) + + for await _ in timerStream.stream { + if Task.isCancelled { + break + } + self.send(type: .ping, data: Data()) + } + + SDLLogger.shared.log("[SDLQUICClient] udp pingTask cancel") + } } func send(type: SDLPacketType, data: Data) { @@ -223,26 +238,26 @@ final class SDLQUICClient { guard let eventVal = buffer.readInteger(as: UInt8.self), let event = SDLEventType(rawValue: eventVal), let bytes = buffer.readBytes(length: buffer.readableBytes) else { - SDLLogger.shared.log("[SDLUDPHole] decode error 15") + SDLLogger.shared.log("[SDLQUICClient] decode error 15") return nil } switch event { case .natChanged: guard let natChangedEvent = try? SDLNatChangedEvent(serializedBytes: bytes) else { - SDLLogger.shared.log("[SDLUDPHole] decode error 16") + SDLLogger.shared.log("[SDLQUICClient] decode error 16") return nil } return .event(.natChanged(natChangedEvent)) case .sendRegister: guard let sendRegisterEvent = try? SDLSendRegisterEvent(serializedBytes: bytes) else { - SDLLogger.shared.log("[SDLUDPHole] decode error 17") + SDLLogger.shared.log("[SDLQUICClient] decode error 17") return nil } return .event(.sendRegister(sendRegisterEvent)) case .networkShutdown: guard let networkShutdownEvent = try? SDLNetworkShutdownEvent(serializedBytes: bytes) else { - SDLLogger.shared.log("[SDLUDPHole] decode error 18") + SDLLogger.shared.log("[SDLQUICClient] decode error 18") return nil } return .event(.networkShutdown(networkShutdownEvent)) @@ -250,7 +265,7 @@ final class SDLQUICClient { case .pong: return .pong default: - SDLLogger.shared.log("SDLUDPHole decode miss type: \(type)") + SDLLogger.shared.log("SDLQUICClient decode miss type: \(type)") return nil } @@ -258,6 +273,7 @@ final class SDLQUICClient { deinit { self.readTask?.cancel() + self.pingTask?.cancel() self.messageCont.finish() } }