From 5358d9a2b74899ac898dd55ac6375d5b8f8f879d Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Fri, 27 Mar 2026 13:28:01 +0800 Subject: [PATCH] fix message --- Tun/Punchnet/Actors/SDLContextActor.swift | 3 - Tun/Punchnet/Actors/SDLPuncherActor.swift | 69 ++++++++++------------- 2 files changed, 29 insertions(+), 43 deletions(-) diff --git a/Tun/Punchnet/Actors/SDLContextActor.swift b/Tun/Punchnet/Actors/SDLContextActor.swift index ea60283..397886e 100644 --- a/Tun/Punchnet/Actors/SDLContextActor.swift +++ b/Tun/Punchnet/Actors/SDLContextActor.swift @@ -104,9 +104,6 @@ actor SDLContextActor { // 启动arp的定时清理任务 await self.arpServer.start() - // 启动puncher的定期扫描任务 - await self.puncherActor.start() - await self.supervisor.addWorker(name: "quicClient") { SDLLogger.shared.log("[SDLContext] try start quicClient") let quicClient = try await self.startQUICClient() diff --git a/Tun/Punchnet/Actors/SDLPuncherActor.swift b/Tun/Punchnet/Actors/SDLPuncherActor.swift index 9454ee4..f2af1d2 100644 --- a/Tun/Punchnet/Actors/SDLPuncherActor.swift +++ b/Tun/Punchnet/Actors/SDLPuncherActor.swift @@ -9,14 +9,20 @@ import Foundation import NIOCore actor SDLPuncherActor { - nonisolated private let cooldownInterval: TimeInterval = 5 + // 10秒内只需要提交一次查询 + nonisolated private let cooldownInterval: TimeInterval = 10 + + struct RequestContext { + let expireAt: Date + let request: RegisterRequest + + func isExpired() -> Bool { + return expireAt < Date() + } + } // dstMac - private var coolingDown: [Data: (UInt32, Date)] = [:] - private var pktId: UInt32 = 1 - // 提交后还没有响应的请求 - private var pendingRequests: [UInt32: RegisterRequest] = [:] - private var cleanupTask: Task? + private var pendingRequests: [Data: RequestContext] = [:] struct RegisterRequest { let srcMac: Data @@ -24,38 +30,28 @@ actor SDLPuncherActor { let networkId: UInt32 } - // 启动定时清理任务 - func start() { - self.cleanupTask?.cancel() - - self.cleanupTask = Task { - while !Task.isCancelled { - try? await Task.sleep(for: .seconds(1)) - self.cleanExpiredCoolingDown() - } - } - } - func submitRegisterRequest(quicClient: SDLQUICClient?, request: RegisterRequest) { - let dstMac = request.dstMac - guard let quicClient, coolingDown[dstMac] == nil else { + guard let quicClient else { return } - coolingDown[dstMac] = (pktId, Date().addingTimeInterval(cooldownInterval)) - + // 数据不存在,或者已经过期;才能提交 + let dstMac = request.dstMac + guard self.isRequestExpired(dstMac: dstMac) else { + return + } + + pendingRequests[dstMac] = .init(expireAt: Date().addingTimeInterval(cooldownInterval), request: request) // 触发一次打洞 var queryInfo = SDLQueryInfo() queryInfo.dstMac = request.dstMac - self.pendingRequests[pktId] = request - if let queryData = try? queryInfo.serializedData() { quicClient.send(type: .queryInfo, data: queryData) } } func handlePeerInfo(using udpHole: SDLUDPHole?, peerInfo: SDLPeerInfo) async { - guard let udpHole, let request = pendingRequests.removeValue(forKey: peerInfo.pktID), + guard let udpHole, let requestContext = pendingRequests.removeValue(forKey: peerInfo.dstMac), let remoteAddress = try? await peerInfo.v4Info.socketAddress() else { return } @@ -63,28 +59,21 @@ actor SDLPuncherActor { SDLLogger.shared.log("[SDLContext] hole sock address: \(remoteAddress)", level: .debug) // 发送register包 var register = SDLRegister() - register.networkID = request.networkId - register.srcMac = request.srcMac - register.dstMac = request.dstMac + register.networkID = requestContext.request.networkId + register.srcMac = requestContext.request.srcMac + register.dstMac = requestContext.request.dstMac if let registerData = try? register.serializedData() { udpHole.send(type: .register, data: registerData, remoteAddress: remoteAddress) } } - private func cleanExpiredCoolingDown() { - let date = Date() - for (key, (pktId, expireAt)) in coolingDown { - if expireAt < date { - self.coolingDown.removeValue(forKey: key) - self.pendingRequests.removeValue(forKey: pktId) - } + // 判断是否需要提交 + func isRequestExpired(dstMac: Data) -> Bool { + if let context = pendingRequests[dstMac] { + return context.isExpired() } - } - - deinit { - self.cleanupTask?.cancel() - self.cleanupTask = nil + return true } }