diff --git a/Tun/Punchnet/SDLContextActor.swift b/Tun/Punchnet/SDLContextActor.swift index d942033..ade4f52 100644 --- a/Tun/Punchnet/SDLContextActor.swift +++ b/Tun/Punchnet/SDLContextActor.swift @@ -14,8 +14,15 @@ import NIOCore 1. 处理rsa的加解密逻辑 */ actor SDLContextActor { - nonisolated let config: SDLConfiguration + enum State { + case unregistered + case registered + } + + nonisolated let config: SDLConfiguration + private var state: State = .unregistered + // nat的网络类型 var natType: SDLNATProberActor.NatType = .blocked @@ -300,6 +307,7 @@ actor SDLContextActor { do { try await self.setNetworkSettings(networkAddress: self.config.networkAddress, dnsServer: SDLDNSClient.Helper.dnsServer) SDLLogger.shared.log("[SDLContext] setNetworkSettings successed") + self.state = .registered self.startReader() } catch let err { SDLLogger.shared.log("[SDLContext] setTunnelNetworkSettings get error: \(err)", level: .error) @@ -378,6 +386,20 @@ actor SDLContextActor { if let registerSuperData = try? registerSuper.serializedData() { SDLLogger.shared.log("[SDLContext] will send register super") self.udpHole?.send(type: .registerSuper, data: registerSuperData, remoteAddress: self.config.stunSocketAddress) + + // 5秒后检查注册是否完成 + Task { + try await Task.sleep(for: .seconds(5)) + self.checkRegisterState() + } + } + } + + // 检查注册状态 + private func checkRegisterState() { + if self.state == .unregistered { + SDLLogger.shared.log("[SDLContext] register super failed, retry") + self.doRegisterSuper() } }