解决系统的异常退出问题

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):
let dstMac = natChangedEvent.mac
SDLLogger.shared.log("[SDLContext] natChangedEvent, dstMac: \(dstMac)", level: .info)
sessionManager.removeSession(dstMac: dstMac)
await sessionManager.removeSession(dstMac: dstMac)
case .sendRegister(let sendRegisterEvent):
SDLLogger.shared.log("[SDLContext] sendRegisterEvent, ip: \(sendRegisterEvent)", level: .debug)
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
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)
// , super-nodenatudpnat
let session = Session(dstMac: register.srcMac, natAddress: remoteAddress)
self.sessionManager.addSession(session: session)
await self.sessionManager.addSession(session: session)
} else {
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,
let networkAddr = config.networkAddress
if registerAck.dstMac == networkAddr.mac && registerAck.networkID == networkAddr.networkId {
let session = Session(dstMac: registerAck.srcMac, natAddress: remoteAddress)
self.sessionManager.addSession(session: session)
await self.sessionManager.addSession(session: session)
} else {
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 {
// 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)
udpHole.send(type: .data, data: data, remoteAddress: session.natAddress)
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 lock = os_unfair_lock()
// session
private let ttl: Int32 = 10
func getSession(toAddress: Data) -> Session? {
os_unfair_lock_lock(&lock)
defer{
os_unfair_lock_unlock(&lock)
}
let timestamp = Int32(Date().timeIntervalSince1970)
if let session = self.sessions[toAddress] {
if session.lastTimestamp >= timestamp + ttl {
@ -54,20 +48,10 @@ final class SessionManager {
}
func addSession(session: Session) {
os_unfair_lock_lock(&lock)
defer{
os_unfair_lock_unlock(&lock)
}
self.sessions[session.dstMac] = session
}
func removeSession(dstMac: Data) {
os_unfair_lock_lock(&lock)
defer{
os_unfair_lock_unlock(&lock)
}
self.sessions.removeValue(forKey: dstMac)
}