This commit is contained in:
anlicheng 2026-03-10 15:46:54 +08:00
parent 6bc0f82169
commit 10278dfef0
2 changed files with 23 additions and 22 deletions

View File

@ -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.quicClient = quicClient
self.quicWorkers = [messageTask, pingTask] self.quicWorkers = [messageTask]
return quicClient return quicClient
} }

View File

@ -28,6 +28,7 @@ final class SDLQUICClient {
public var messageStream: AsyncStream<SDLQUICInboundMessage> public var messageStream: AsyncStream<SDLQUICInboundMessage>
private let messageCont: AsyncStream<SDLQUICInboundMessage>.Continuation private let messageCont: AsyncStream<SDLQUICInboundMessage>.Continuation
private var readTask: Task<Void, Never>? private var readTask: Task<Void, Never>?
private var pingTask: Task<Void, Never>?
private let connection: NWConnection private let connection: NWConnection
private let queue = DispatchQueue(label: "com.sdl.QUICClient.queue") // 线 private let queue = DispatchQueue(label: "com.sdl.QUICClient.queue") // 线
@ -58,7 +59,7 @@ final class SDLQUICClient {
func start() { func start() {
connection.stateUpdateHandler = { state in connection.stateUpdateHandler = { state in
SDLLogger.shared.log("[SDLQUICTransport] new state: \(state)") SDLLogger.shared.log("[SDLQUICClient] new state: \(state)")
switch state { switch state {
case .ready: case .ready:
self.readyCont.yield() 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) { func send(type: SDLPacketType, data: Data) {
@ -223,26 +238,26 @@ final class SDLQUICClient {
guard let eventVal = buffer.readInteger(as: UInt8.self), guard let eventVal = buffer.readInteger(as: UInt8.self),
let event = SDLEventType(rawValue: eventVal), let event = SDLEventType(rawValue: eventVal),
let bytes = buffer.readBytes(length: buffer.readableBytes) else { let bytes = buffer.readBytes(length: buffer.readableBytes) else {
SDLLogger.shared.log("[SDLUDPHole] decode error 15") SDLLogger.shared.log("[SDLQUICClient] decode error 15")
return nil return nil
} }
switch event { switch event {
case .natChanged: case .natChanged:
guard let natChangedEvent = try? SDLNatChangedEvent(serializedBytes: bytes) else { 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 nil
} }
return .event(.natChanged(natChangedEvent)) return .event(.natChanged(natChangedEvent))
case .sendRegister: case .sendRegister:
guard let sendRegisterEvent = try? SDLSendRegisterEvent(serializedBytes: bytes) else { 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 nil
} }
return .event(.sendRegister(sendRegisterEvent)) return .event(.sendRegister(sendRegisterEvent))
case .networkShutdown: case .networkShutdown:
guard let networkShutdownEvent = try? SDLNetworkShutdownEvent(serializedBytes: bytes) else { 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 nil
} }
return .event(.networkShutdown(networkShutdownEvent)) return .event(.networkShutdown(networkShutdownEvent))
@ -250,7 +265,7 @@ final class SDLQUICClient {
case .pong: case .pong:
return .pong return .pong
default: default:
SDLLogger.shared.log("SDLUDPHole decode miss type: \(type)") SDLLogger.shared.log("SDLQUICClient decode miss type: \(type)")
return nil return nil
} }
@ -258,6 +273,7 @@ final class SDLQUICClient {
deinit { deinit {
self.readTask?.cancel() self.readTask?.cancel()
self.pingTask?.cancel()
self.messageCont.finish() self.messageCont.finish()
} }
} }