diff --git a/Tun/Punchnet/Actors/SDLPuncherActor.swift b/Tun/Punchnet/Actors/SDLPuncherActor.swift index f2af1d2..1ebb812 100644 --- a/Tun/Punchnet/Actors/SDLPuncherActor.swift +++ b/Tun/Punchnet/Actors/SDLPuncherActor.swift @@ -41,7 +41,7 @@ actor SDLPuncherActor { return } - pendingRequests[dstMac] = .init(expireAt: Date().addingTimeInterval(cooldownInterval), request: request) + self.pendingRequests[dstMac] = .init(expireAt: Date().addingTimeInterval(cooldownInterval), request: request) // 触发一次打洞 var queryInfo = SDLQueryInfo() queryInfo.dstMac = request.dstMac @@ -51,20 +51,27 @@ actor SDLPuncherActor { } func handlePeerInfo(using udpHole: SDLUDPHole?, peerInfo: SDLPeerInfo) async { - guard let udpHole, let requestContext = pendingRequests.removeValue(forKey: peerInfo.dstMac), - let remoteAddress = try? await peerInfo.v4Info.socketAddress() else { + // 如果服务器返回了值,优先删除掉; 避免数据堆积 + guard let requestContext = pendingRequests.removeValue(forKey: peerInfo.dstMac) else { return } - SDLLogger.shared.log("[SDLContext] hole sock address: \(remoteAddress)", level: .debug) - // 发送register包 - var register = SDLRegister() - register.networkID = requestContext.request.networkId - register.srcMac = requestContext.request.srcMac - register.dstMac = requestContext.request.dstMac + // 判断必要的值是否存在 + guard let udpHole, peerInfo.hasV4Info else { + return + } - if let registerData = try? register.serializedData() { - udpHole.send(type: .register, data: registerData, remoteAddress: remoteAddress) + if let remoteAddress = try? await peerInfo.v4Info.socketAddress() { + SDLLogger.shared.log("[SDLContext] hole sock address: \(remoteAddress)", level: .debug) + // 发送register包 + var register = SDLRegister() + 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) + } } }