fix SDLUDPHole
This commit is contained in:
parent
c3752bb688
commit
358e555666
@ -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")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user