From 9aaaad62541f3664e9a36babf9ec652afe39f2c9 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Wed, 4 Feb 2026 14:58:18 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E7=B3=BB=E7=BB=9F=E7=9A=84?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E9=80=80=E5=87=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tun/Punchnet/SDLContextActor.swift | 12 ++++++------ Tun/Punchnet/SessionManager.swift | 18 +----------------- 2 files changed, 7 insertions(+), 23 deletions(-) diff --git a/Tun/Punchnet/SDLContextActor.swift b/Tun/Punchnet/SDLContextActor.swift index 5103b4e..d942033 100644 --- a/Tun/Punchnet/SDLContextActor.swift +++ b/Tun/Punchnet/SDLContextActor.swift @@ -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) diff --git a/Tun/Punchnet/SessionManager.swift b/Tun/Punchnet/SessionManager.swift index 81fbc63..a65096c 100644 --- a/Tun/Punchnet/SessionManager.swift +++ b/Tun/Punchnet/SessionManager.swift @@ -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) }