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