fix SDLUDPHole

This commit is contained in:
anlicheng 2026-05-06 22:24:56 +08:00
parent c3752bb688
commit 358e555666

View File

@ -111,7 +111,7 @@ actor SDLContextActor {
private var ipv6AssistClient: SDLIPV6AssistClient? private var ipv6AssistClient: SDLIPV6AssistClient?
// //
private var readTask: Task<(), Never>? private var readTask: Task<Void, Error>?
private let sessionManager = SessionManager() private let sessionManager = SessionManager()
nonisolated private let arpServer: ArpServer nonisolated private let arpServer: ArpServer
@ -212,6 +212,7 @@ actor SDLContextActor {
self.superMonitorTask = nil self.superMonitorTask = nil
await superClient?.stop() await superClient?.stop()
SDLLogger.log("[SDLContext] try to cancel readTask")
self.readTask?.cancel() self.readTask?.cancel()
self.readTask = nil self.readTask = nil
@ -937,26 +938,30 @@ extension SDLContextActor {
// , 线packetFlow // , 线packetFlow
private func startReader() { private func startReader() {
//
self.readTask?.cancel() self.readTask?.cancel()
// //
let provider = self.provider let provider = self.provider
self.readTask = Task(priority: .high) { self.readTask = Task(priority: .high) { [weak self] in
repeat { try await withTaskCancellationHandler {
do { do {
try Task.checkCancellation() repeat {
let (packets, numbers) = await provider.packetFlow.readPackets() try Task.checkCancellation()
try Task.checkCancellation() let (packets, numbers) = await provider.packetFlow.readPackets()
for (data, number) in zip(packets, numbers) where number == 2 { try Task.checkCancellation()
if let ipPacket = IPPacket(data) { for (data, number) in zip(packets, numbers) where number == 2 {
await self.dealTunPacket(packet: ipPacket) if let ipPacket = IPPacket(data) {
await self?.dealTunPacket(packet: ipPacket)
}
} }
} } while true
SDLLogger.log("[SDLContext] readTask finish")
} catch let err { } catch let err {
SDLLogger.log("[SDLContext] readTask catch error: \(err)") SDLLogger.log("[SDLContext] readTask catch error: \(err)")
throw err
} }
} while true } onCancel: {
SDLLogger.log("[SDLContext] readTask onCancel")
}
} }
} }