修复注册问题
This commit is contained in:
parent
37042fb3c1
commit
9f1eadeaaa
@ -66,10 +66,15 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
|
|||||||
|
|
||||||
override func sleep(completionHandler: @escaping () -> Void) {
|
override func sleep(completionHandler: @escaping () -> Void) {
|
||||||
// Add code here to get ready to sleep.
|
// 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")
|
SDLLogger.log("[PacketTunnelProvider] sleep")
|
||||||
|
completionHandler()
|
||||||
}))
|
}))
|
||||||
completionHandler()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override func wake() {
|
override func wake() {
|
||||||
|
|||||||
@ -101,9 +101,6 @@ actor SDLContextActor {
|
|||||||
// Flow流会话管理, 过期时间为: 180秒
|
// Flow流会话管理, 过期时间为: 180秒
|
||||||
private let flowSessionManager = SDLFlowSessionManager(sessionTimeout: 180)
|
private let flowSessionManager = SDLFlowSessionManager(sessionTimeout: 180)
|
||||||
|
|
||||||
// 注册任务
|
|
||||||
private var registerTask: Task<Void, Never>?
|
|
||||||
|
|
||||||
// stunRequest任务
|
// stunRequest任务
|
||||||
private var stunRequestTask: Task<Void, Never>?
|
private var stunRequestTask: Task<Void, Never>?
|
||||||
|
|
||||||
@ -157,9 +154,6 @@ actor SDLContextActor {
|
|||||||
|
|
||||||
self.flowSessionManager.clear()
|
self.flowSessionManager.clear()
|
||||||
|
|
||||||
self.registerTask?.cancel()
|
|
||||||
self.registerTask = nil
|
|
||||||
|
|
||||||
self.stunRequestTask?.cancel()
|
self.stunRequestTask?.cancel()
|
||||||
self.stunRequestTask = nil
|
self.stunRequestTask = nil
|
||||||
|
|
||||||
@ -245,42 +239,24 @@ extension SDLContextActor {
|
|||||||
switch message {
|
switch message {
|
||||||
case .welcome(let welcome):
|
case .welcome(let welcome):
|
||||||
SDLLogger.log("[SDLContext] quic welcome: \(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()
|
await self.doRegisterSuper()
|
||||||
SDLLogger.log("[SDLContext] quic 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:
|
case .pong:
|
||||||
//SDLLogger.shared.log("[SDLContext] quic pong")
|
//SDLLogger.shared.log("[SDLContext] quic pong")
|
||||||
()
|
()
|
||||||
case .registerSuperAck(let registerSuperAck):
|
case .registerSuperAck(let registerSuperAck):
|
||||||
self.registerTask?.cancel()
|
|
||||||
self.registerTask = nil
|
|
||||||
|
|
||||||
await self.handleRegisterSuperAck(registerSuperAck: registerSuperAck)
|
await self.handleRegisterSuperAck(registerSuperAck: registerSuperAck)
|
||||||
case .registerSuperNak(let registerSuperNak):
|
case .registerSuperNak(let registerSuperNak):
|
||||||
self.registerTask?.cancel()
|
|
||||||
self.registerTask = nil
|
|
||||||
|
|
||||||
self.handleRegisterSuperNak(nakPacket: registerSuperNak)
|
self.handleRegisterSuperNak(nakPacket: registerSuperNak)
|
||||||
case .peerInfo(let peerInfo):
|
case .peerInfo(let peerInfo):
|
||||||
SDLLogger.log("[SDLContext] peer message: \(peerInfo)")
|
SDLLogger.log("[SDLContext] peer message: \(peerInfo)")
|
||||||
@ -360,6 +336,9 @@ extension SDLContextActor {
|
|||||||
SDLLogger.log("[SDLContext] updatePolicyTask stop with err: \(err)")
|
SDLLogger.log("[SDLContext] updatePolicyTask stop with err: \(err)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 启动stun任务
|
||||||
|
await self.startStunRequestTask()
|
||||||
}
|
}
|
||||||
|
|
||||||
private func handleRegisterSuperNak(nakPacket: SDLRegisterSuperNak) {
|
private func handleRegisterSuperNak(nakPacket: SDLRegisterSuperNak) {
|
||||||
@ -551,16 +530,10 @@ extension SDLContextActor {
|
|||||||
extension SDLContextActor {
|
extension SDLContextActor {
|
||||||
|
|
||||||
// MARK: -- StunRequestTask
|
// MARK: -- StunRequestTask
|
||||||
private func startStunRequestTask(welcome: SDLWelcome) async {
|
private func startStunRequestTask() async {
|
||||||
self.stunRequestTask?.cancel()
|
self.stunRequestTask?.cancel()
|
||||||
self.stunRequestTask = nil
|
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
|
self.stunRequestTask = Task { [weak self] in
|
||||||
let timerStream = SDLAsyncTimerStream()
|
let timerStream = SDLAsyncTimerStream()
|
||||||
@ -570,21 +543,30 @@ extension SDLContextActor {
|
|||||||
if Task.isCancelled {
|
if Task.isCancelled {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let probeReply = try? await self?.ipv6AssistClient?.probe(requestTimeout: .seconds(3))
|
||||||
|
if Task.isCancelled {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
let probeReply = try? await ipv6AssistClient?.probe(requestTimeout: .seconds(3))
|
|
||||||
if let v6Info = probeReply?.v6Info, let v6Address = SDLUtil.ipv6DataToString(v6Info.v6) {
|
if let v6Info = probeReply?.v6Info, let v6Address = SDLUtil.ipv6DataToString(v6Info.v6) {
|
||||||
SDLLogger.log("[SDLContext] probe ipv6 address: \(v6Address)")
|
SDLLogger.log("[SDLContext] probe ipv6 address: \(v6Address)")
|
||||||
} else {
|
} else {
|
||||||
SDLLogger.log("[SDLContext] probe ipv6 address: empty")
|
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")
|
SDLLogger.log("[SDLContext] udp stunRequestTask cancel")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func sendStunRequest(probeReply: SDLV6AssistProbeReply?) async {
|
private func sendStunRequest(v6Info: SDLV6Info?) async {
|
||||||
guard let sessionToken = self.sessionToken else {
|
guard let sessionToken = self.sessionToken else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -597,7 +579,7 @@ extension SDLContextActor {
|
|||||||
stunRequest.natType = UInt32(self.natType.rawValue)
|
stunRequest.natType = UInt32(self.natType.rawValue)
|
||||||
stunRequest.sessionToken = sessionToken
|
stunRequest.sessionToken = sessionToken
|
||||||
|
|
||||||
if let v6Info = probeReply?.v6Info {
|
if let v6Info {
|
||||||
stunRequest.v6Info = v6Info
|
stunRequest.v6Info = v6Info
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user