修复注册问题

This commit is contained in:
anlicheng 2026-05-09 10:39:37 +08:00
parent 37042fb3c1
commit 9f1eadeaaa
2 changed files with 33 additions and 46 deletions

View File

@ -66,10 +66,15 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
override func sleep(completionHandler: @escaping () -> Void) {
// Add code here to get ready to sleep.
self.runtimeEnv?.submitCommand(command: .stop(completion: {
guard let runtimeEnv else {
completionHandler()
return
}
runtimeEnv.submitCommand(command: .stop(completion: {
SDLLogger.log("[PacketTunnelProvider] sleep")
completionHandler()
}))
completionHandler()
}
override func wake() {

View File

@ -101,9 +101,6 @@ actor SDLContextActor {
// Flow : 180
private let flowSessionManager = SDLFlowSessionManager(sessionTimeout: 180)
//
private var registerTask: Task<Void, Never>?
// stunRequest
private var stunRequestTask: Task<Void, Never>?
@ -157,9 +154,6 @@ actor SDLContextActor {
self.flowSessionManager.clear()
self.registerTask?.cancel()
self.registerTask = nil
self.stunRequestTask?.cancel()
self.stunRequestTask = nil
@ -245,42 +239,24 @@ extension SDLContextActor {
switch message {
case .welcome(let welcome):
SDLLogger.log("[SDLContext] quic welcome: \(welcome)")
await self.ipv6AssistClient?.stop()
self.ipv6AssistClient = nil
// v6
if welcome.hasIpv6Assist {
self.ipv6AssistClient = SDLIPV6AssistClient(assistServerInfo: welcome.ipv6Assist)
await self.ipv6AssistClient?.start()
}
//
await self.doRegisterSuper()
SDLLogger.log("[SDLContext] quic doRegisterSuper")
//
self.registerTask = Task {
do {
try await Task.sleep(for: .seconds(5))
try Task.checkCancellation()
// Tunnel
self.publishTunnelEvent(message: "校验失败")
// 退
let error = NSError(domain: "com.jihe.punchnet.tun", code: -3)
self.provider.cancelTunnelWithError(error)
} catch {
SDLLogger.log("[SDLContext] registerTask: cancel")
return
}
}
// stun
await self.startStunRequestTask(welcome: welcome)
case .pong:
//SDLLogger.shared.log("[SDLContext] quic pong")
()
case .registerSuperAck(let registerSuperAck):
self.registerTask?.cancel()
self.registerTask = nil
await self.handleRegisterSuperAck(registerSuperAck: registerSuperAck)
case .registerSuperNak(let registerSuperNak):
self.registerTask?.cancel()
self.registerTask = nil
self.handleRegisterSuperNak(nakPacket: registerSuperNak)
case .peerInfo(let peerInfo):
SDLLogger.log("[SDLContext] peer message: \(peerInfo)")
@ -360,6 +336,9 @@ extension SDLContextActor {
SDLLogger.log("[SDLContext] updatePolicyTask stop with err: \(err)")
}
}
// stun
await self.startStunRequestTask()
}
private func handleRegisterSuperNak(nakPacket: SDLRegisterSuperNak) {
@ -551,16 +530,10 @@ extension SDLContextActor {
extension SDLContextActor {
// MARK: -- StunRequestTask
private func startStunRequestTask(welcome: SDLWelcome) async {
private func startStunRequestTask() async {
self.stunRequestTask?.cancel()
self.stunRequestTask = nil
await self.ipv6AssistClient?.stop()
self.ipv6AssistClient = SDLIPV6AssistClient(assistServerInfo: welcome.ipv6Assist)
await self.ipv6AssistClient?.start()
let ipv6AssistClient = self.ipv6AssistClient
// welcome使ipv6
//
self.stunRequestTask = Task { [weak self] in
let timerStream = SDLAsyncTimerStream()
@ -571,20 +544,29 @@ extension SDLContextActor {
break
}
let probeReply = try? await ipv6AssistClient?.probe(requestTimeout: .seconds(3))
let probeReply = try? await self?.ipv6AssistClient?.probe(requestTimeout: .seconds(3))
if Task.isCancelled {
break
}
if let v6Info = probeReply?.v6Info, let v6Address = SDLUtil.ipv6DataToString(v6Info.v6) {
SDLLogger.log("[SDLContext] probe ipv6 address: \(v6Address)")
} else {
SDLLogger.log("[SDLContext] probe ipv6 address: empty")
}
await self?.sendStunRequest(probeReply: probeReply)
if Task.isCancelled {
break
}
await self?.sendStunRequest(v6Info: probeReply?.v6Info)
}
SDLLogger.log("[SDLContext] udp stunRequestTask cancel")
}
}
private func sendStunRequest(probeReply: SDLV6AssistProbeReply?) async {
private func sendStunRequest(v6Info: SDLV6Info?) async {
guard let sessionToken = self.sessionToken else {
return
}
@ -597,7 +579,7 @@ extension SDLContextActor {
stunRequest.natType = UInt32(self.natType.rawValue)
stunRequest.sessionToken = sessionToken
if let v6Info = probeReply?.v6Info {
if let v6Info {
stunRequest.v6Info = v6Info
}