解决系统的异常退出问题

This commit is contained in:
anlicheng 2026-02-04 14:58:18 +08:00
parent 8c8006bc69
commit 9aaaad6254
2 changed files with 7 additions and 23 deletions

View File

@ -337,7 +337,7 @@ actor SDLContextActor {
case .natChanged(let natChangedEvent): case .natChanged(let natChangedEvent):
let dstMac = natChangedEvent.mac let dstMac = natChangedEvent.mac
SDLLogger.shared.log("[SDLContext] natChangedEvent, dstMac: \(dstMac)", level: .info) SDLLogger.shared.log("[SDLContext] natChangedEvent, dstMac: \(dstMac)", level: .info)
sessionManager.removeSession(dstMac: dstMac) await sessionManager.removeSession(dstMac: dstMac)
case .sendRegister(let sendRegisterEvent): case .sendRegister(let sendRegisterEvent):
SDLLogger.shared.log("[SDLContext] sendRegisterEvent, ip: \(sendRegisterEvent)", level: .debug) SDLLogger.shared.log("[SDLContext] sendRegisterEvent, ip: \(sendRegisterEvent)", level: .debug)
let address = SDLUtil.int32ToIp(sendRegisterEvent.natIp) let address = SDLUtil.int32ToIp(sendRegisterEvent.natIp)
@ -381,7 +381,7 @@ actor SDLContextActor {
} }
} }
private func handleRegister(remoteAddress: SocketAddress, register: SDLRegister) throws { private func handleRegister(remoteAddress: SocketAddress, register: SDLRegister) async throws {
let networkAddr = config.networkAddress let networkAddr = config.networkAddress
SDLLogger.shared.log("register packet: \(register), network_address: \(networkAddr)", level: .debug) SDLLogger.shared.log("register packet: \(register), network_address: \(networkAddr)", level: .debug)
@ -396,18 +396,18 @@ actor SDLContextActor {
self.udpHole?.send(type: .registerAck, data: try registerAck.serializedData(), remoteAddress: remoteAddress) self.udpHole?.send(type: .registerAck, data: try registerAck.serializedData(), remoteAddress: remoteAddress)
// , super-nodenatudpnat // , super-nodenatudpnat
let session = Session(dstMac: register.srcMac, natAddress: remoteAddress) let session = Session(dstMac: register.srcMac, natAddress: remoteAddress)
self.sessionManager.addSession(session: session) await self.sessionManager.addSession(session: session)
} else { } else {
SDLLogger.shared.log("SDLContext didReadRegister get a invalid packet, because dst_ip not matched: \(register.dstMac)", level: .warning) SDLLogger.shared.log("SDLContext didReadRegister get a invalid packet, because dst_ip not matched: \(register.dstMac)", level: .warning)
} }
} }
private func handleRegisterAck(remoteAddress: SocketAddress, registerAck: SDLRegisterAck) { private func handleRegisterAck(remoteAddress: SocketAddress, registerAck: SDLRegisterAck) async {
// tun, // tun,
let networkAddr = config.networkAddress let networkAddr = config.networkAddress
if registerAck.dstMac == networkAddr.mac && registerAck.networkID == networkAddr.networkId { if registerAck.dstMac == networkAddr.mac && registerAck.networkID == networkAddr.networkId {
let session = Session(dstMac: registerAck.srcMac, natAddress: remoteAddress) let session = Session(dstMac: registerAck.srcMac, natAddress: remoteAddress)
self.sessionManager.addSession(session: session) await self.sessionManager.addSession(session: session)
} else { } else {
SDLLogger.shared.log("SDLContext didReadRegisterAck get a invalid packet, because dst_mac not matched: \(registerAck.dstMac)", level: .warning) SDLLogger.shared.log("SDLContext didReadRegisterAck get a invalid packet, because dst_mac not matched: \(registerAck.dstMac)", level: .warning)
} }
@ -555,7 +555,7 @@ actor SDLContextActor {
} }
else { else {
// session // session
if let session = self.sessionManager.getSession(toAddress: dstMac) { if let session = await self.sessionManager.getSession(toAddress: dstMac) {
SDLLogger.shared.log("[SDLContext] send packet by session: \(session)", level: .debug) SDLLogger.shared.log("[SDLContext] send packet by session: \(session)", level: .debug)
udpHole.send(type: .data, data: data, remoteAddress: session.natAddress) udpHole.send(type: .data, data: data, remoteAddress: session.natAddress)
self.flowTracer.inc(num: data.count, type: .p2p) self.flowTracer.inc(num: data.count, type: .p2p)

View File

@ -28,19 +28,13 @@ struct Session {
} }
} }
final class SessionManager { actor SessionManager {
private var sessions: [Data:Session] = [:] private var sessions: [Data:Session] = [:]
private var lock = os_unfair_lock()
// session // session
private let ttl: Int32 = 10 private let ttl: Int32 = 10
func getSession(toAddress: Data) -> Session? { func getSession(toAddress: Data) -> Session? {
os_unfair_lock_lock(&lock)
defer{
os_unfair_lock_unlock(&lock)
}
let timestamp = Int32(Date().timeIntervalSince1970) let timestamp = Int32(Date().timeIntervalSince1970)
if let session = self.sessions[toAddress] { if let session = self.sessions[toAddress] {
if session.lastTimestamp >= timestamp + ttl { if session.lastTimestamp >= timestamp + ttl {
@ -54,20 +48,10 @@ final class SessionManager {
} }
func addSession(session: Session) { func addSession(session: Session) {
os_unfair_lock_lock(&lock)
defer{
os_unfair_lock_unlock(&lock)
}
self.sessions[session.dstMac] = session self.sessions[session.dstMac] = session
} }
func removeSession(dstMac: Data) { func removeSession(dstMac: Data) {
os_unfair_lock_lock(&lock)
defer{
os_unfair_lock_unlock(&lock)
}
self.sessions.removeValue(forKey: dstMac) self.sessions.removeValue(forKey: dstMac)
} }