diff --git a/Tun/Punchnet/Actors/SDLContextActor.swift b/Tun/Punchnet/Actors/SDLContextActor.swift index 0a81e71..fc05cc9 100644 --- a/Tun/Punchnet/Actors/SDLContextActor.swift +++ b/Tun/Punchnet/Actors/SDLContextActor.swift @@ -165,7 +165,9 @@ actor SDLContextActor { await quicClient.start() defer { - self.quicClient = nil + if self.quicClient === quicClient { + self.quicClient = nil + } SDLLogger.log("[SDLContext] startSuperClient defer") } @@ -492,8 +494,11 @@ actor SDLContextActor { self.dnsMonitorTask?.cancel() self.dnsLocalMonitorTask?.cancel() + let quicClient = self.quicClient + self.quicClient = nil self.superMonitorTask?.cancel() - self.udpHoleMonitorTask?.cancel() + self.superMonitorTask = nil + await quicClient?.stop() self.readTask?.cancel() self.readTask = nil diff --git a/Tun/Punchnet/Actors/SDLQuicClient.swift b/Tun/Punchnet/Actors/SDLQuicClient.swift index d860bde..2c40c42 100644 --- a/Tun/Punchnet/Actors/SDLQuicClient.swift +++ b/Tun/Punchnet/Actors/SDLQuicClient.swift @@ -44,7 +44,6 @@ actor SDLQUICClient { private var readTask: Task? private var connection: NWConnection? - private let queue = DispatchQueue(label: "com.sdl.QUICClient.queue") // 专用队列保证线程安全 private let host: String private let port: UInt16 @@ -58,6 +57,9 @@ actor SDLQUICClient { } func start() { + let host = self.host + let queue = DispatchQueue(label: "com.sdl.QUICClient.queue") // 专用队列保证线程安全 + let options = NWProtocolTLS.Options() sec_protocol_options_add_tls_application_protocol( options.securityProtocolOptions, @@ -67,11 +69,11 @@ actor SDLQUICClient { // 这里设置证书的校验逻辑 sec_protocol_options_set_verify_block( options.securityProtocolOptions, - { metadata, trust, complete in + { _, trust, complete in // 执行公钥校验 - complete(TLSVerifier.verify(trust: trust, host: self.host)) + complete(TLSVerifier.verify(trust: trust, host: host)) }, - self.queue + queue ) SDLLogger.log("[SDLQUICClient] start with tls protocol", for: .debug) @@ -87,7 +89,7 @@ actor SDLQUICClient { await self?.handleConnectionState(state: state) } } - connection.start(queue: self.queue) + connection.start(queue: queue) self.connection = connection } @@ -190,7 +192,13 @@ actor SDLQUICClient { self.state = .stopped self.readTask?.cancel() - self.connection?.cancel() + self.readTask = nil + + let connection = self.connection + self.connection = nil + connection?.stateUpdateHandler = nil + connection?.cancel() + self.finishMessageContinuationIfNeed(throwing: nil) SDLLogger.log("[SDLQUICClient] stopped")