fix super event
This commit is contained in:
parent
75d7761896
commit
a8f0bc7804
@ -625,6 +625,10 @@ actor SDLContextActor {
|
|||||||
// 处理和Super之间的通讯
|
// 处理和Super之间的通讯
|
||||||
extension SDLContextActor {
|
extension SDLContextActor {
|
||||||
|
|
||||||
|
private func makeSuperEventProcessor() -> SDLSuperEventProcessor {
|
||||||
|
return .init(networkAddress: self.config.networkAddress)
|
||||||
|
}
|
||||||
|
|
||||||
// 开启注册任务
|
// 开启注册任务
|
||||||
private func startRegisterLoop() {
|
private func startRegisterLoop() {
|
||||||
guard self.registerTask == nil else {
|
guard self.registerTask == nil else {
|
||||||
@ -711,32 +715,21 @@ extension SDLContextActor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func handleEvent(event: SDLEvent) async {
|
private func handleEvent(event: SDLEvent) async {
|
||||||
switch event.event {
|
let processor = self.makeSuperEventProcessor()
|
||||||
case .natChanged(let natChangedEvent):
|
let plan = await processor.makeProcessingPlan(event: event)
|
||||||
let dstMac = natChangedEvent.mac
|
if let logMessage = plan.logMessage {
|
||||||
SDLLogger.log("[SDLContext] natChangedEvent, dstMac: \(dstMac)")
|
SDLLogger.log(logMessage)
|
||||||
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 {
|
switch plan.action {
|
||||||
let address = SDLUtil.int32ToIp(sendRegisterEvent.natIp)
|
case .removeSession(let dstMac):
|
||||||
if let remoteAddress = try? SocketAddress.makeAddressResolvingHost(address, port: Int(sendRegisterEvent.natPort)) {
|
self.sessionManager.removeSession(dstMac: dstMac)
|
||||||
self.sendPeerPacket(type: .register, data: registerData, remoteAddress: remoteAddress)
|
case .sendRegister(let registerData, let remoteAddresses):
|
||||||
}
|
remoteAddresses.forEach { remoteAddress in
|
||||||
}
|
|
||||||
|
|
||||||
if sendRegisterEvent.hasV6Info, let remoteAddress = try? await sendRegisterEvent.v6Info.socketAddress() {
|
|
||||||
self.sendPeerPacket(type: .register, data: registerData, remoteAddress: remoteAddress)
|
self.sendPeerPacket(type: .register, data: registerData, remoteAddress: remoteAddress)
|
||||||
}
|
}
|
||||||
case .shutdown(let shutdownEvent):
|
case .shutdown(let message):
|
||||||
let alertNotice = NoticeMessage.alert(alert: shutdownEvent.message)
|
let alertNotice = NoticeMessage.alert(alert: message)
|
||||||
self.noticeClient?.send(data: alertNotice)
|
self.noticeClient?.send(data: alertNotice)
|
||||||
|
|
||||||
// 报告错误并退出
|
// 报告错误并退出
|
||||||
|
|||||||
72
Tun/Punchnet/Actors/SDLSuperEventProcessor.swift
Normal file
72
Tun/Punchnet/Actors/SDLSuperEventProcessor.swift
Normal file
@ -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)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user