修复注册问题
This commit is contained in:
parent
37042fb3c1
commit
9f1eadeaaa
@ -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() {
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user