解决系统的异常退出问题
This commit is contained in:
parent
8c8006bc69
commit
9aaaad6254
@ -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-node查询到的nat地址不一定靠谱,需要通过udp包的来源地址作为nat地址
|
||||
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)
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user