From a8f0bc7804adbca3ccdc82f09c48ee7df70d3354 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Wed, 15 Apr 2026 10:04:24 +0800 Subject: [PATCH] fix super event --- Tun/Punchnet/Actors/SDLContextActor.swift | 41 +++++------ .../Actors/SDLSuperEventProcessor.swift | 72 +++++++++++++++++++ 2 files changed, 89 insertions(+), 24 deletions(-) create mode 100644 Tun/Punchnet/Actors/SDLSuperEventProcessor.swift diff --git a/Tun/Punchnet/Actors/SDLContextActor.swift b/Tun/Punchnet/Actors/SDLContextActor.swift index f7564e1..af70d7f 100644 --- a/Tun/Punchnet/Actors/SDLContextActor.swift +++ b/Tun/Punchnet/Actors/SDLContextActor.swift @@ -625,6 +625,10 @@ actor SDLContextActor { // 处理和Super之间的通讯 extension SDLContextActor { + private func makeSuperEventProcessor() -> SDLSuperEventProcessor { + return .init(networkAddress: self.config.networkAddress) + } + // 开启注册任务 private func startRegisterLoop() { guard self.registerTask == nil else { @@ -711,32 +715,21 @@ extension SDLContextActor { } private func handleEvent(event: SDLEvent) async { - switch event.event { - case .natChanged(let natChangedEvent): - let dstMac = natChangedEvent.mac - SDLLogger.log("[SDLContext] natChangedEvent, dstMac: \(dstMac)") - sessionManager.removeSession(dstMac: dstMac) - case .sendRegister(let sendRegisterEvent): - SDLLogger.log("[SDLContext] sendRegisterEvent, ip: \(sendRegisterEvent)") - // 发送register包 - var register = SDLRegister() - register.networkID = self.config.networkAddress.networkId - register.srcMac = self.config.networkAddress.mac - register.dstMac = sendRegisterEvent.dstMac - let registerData = try! register.serializedData() - - if sendRegisterEvent.natIp > 0 && sendRegisterEvent.natPort > 0 { - let address = SDLUtil.int32ToIp(sendRegisterEvent.natIp) - if let remoteAddress = try? SocketAddress.makeAddressResolvingHost(address, port: Int(sendRegisterEvent.natPort)) { - self.sendPeerPacket(type: .register, data: registerData, remoteAddress: remoteAddress) - } - } - - if sendRegisterEvent.hasV6Info, let remoteAddress = try? await sendRegisterEvent.v6Info.socketAddress() { + let processor = self.makeSuperEventProcessor() + let plan = await processor.makeProcessingPlan(event: event) + if let logMessage = plan.logMessage { + SDLLogger.log(logMessage) + } + + switch plan.action { + case .removeSession(let dstMac): + self.sessionManager.removeSession(dstMac: dstMac) + case .sendRegister(let registerData, let remoteAddresses): + remoteAddresses.forEach { remoteAddress in self.sendPeerPacket(type: .register, data: registerData, remoteAddress: remoteAddress) } - case .shutdown(let shutdownEvent): - let alertNotice = NoticeMessage.alert(alert: shutdownEvent.message) + case .shutdown(let message): + let alertNotice = NoticeMessage.alert(alert: message) self.noticeClient?.send(data: alertNotice) // 报告错误并退出 diff --git a/Tun/Punchnet/Actors/SDLSuperEventProcessor.swift b/Tun/Punchnet/Actors/SDLSuperEventProcessor.swift new file mode 100644 index 0000000..ec65aae --- /dev/null +++ b/Tun/Punchnet/Actors/SDLSuperEventProcessor.swift @@ -0,0 +1,72 @@ +// +// SDLSuperEventProcessor.swift +// Tun +// +// Created by 安礼成 on 2026/4/15. +// + +import Foundation +import NIOCore + +final class SDLSuperEventProcessor { + enum ProcessingAction { + case removeSession(dstMac: Data) + case sendRegister(data: Data, remoteAddresses: [SocketAddress]) + case shutdown(message: String) + case none + } + + struct ProcessingPlan { + let logMessage: String? + let action: ProcessingAction + } + + private let networkAddress: SDLConfiguration.NetworkAddress + + init(networkAddress: SDLConfiguration.NetworkAddress) { + self.networkAddress = networkAddress + } + + func makeProcessingPlan(event: SDLEvent) async -> ProcessingPlan { + switch event.event { + case .natChanged(let natChangedEvent): + let dstMac = natChangedEvent.mac + return .init( + logMessage: "[SDLContext] natChangedEvent, dstMac: \(dstMac)", + action: .removeSession(dstMac: dstMac) + ) + case .sendRegister(let sendRegisterEvent): + return await self.makeSendRegisterPlan(sendRegisterEvent) + case .shutdown(let shutdownEvent): + return .init(logMessage: nil, action: .shutdown(message: shutdownEvent.message)) + case .none: + return .init(logMessage: nil, action: .none) + } + } + + private func makeSendRegisterPlan(_ event: SDLEvent.SendRegister) async -> ProcessingPlan { + // 发送register包 + var register = SDLRegister() + register.networkID = self.networkAddress.networkId + register.srcMac = self.networkAddress.mac + register.dstMac = event.dstMac + let registerData = try! register.serializedData() + + var remoteAddresses: [SocketAddress] = [] + if event.natIp > 0 && event.natPort > 0 { + let address = SDLUtil.int32ToIp(event.natIp) + if let remoteAddress = try? SocketAddress.makeAddressResolvingHost(address, port: Int(event.natPort)) { + remoteAddresses.append(remoteAddress) + } + } + + if event.hasV6Info, let remoteAddress = try? await event.v6Info.socketAddress() { + remoteAddresses.append(remoteAddress) + } + + return .init( + logMessage: "[SDLContext] sendRegisterEvent, ip: \(event)", + action: .sendRegister(data: registerData, remoteAddresses: remoteAddresses) + ) + } +}