From 6e0e40c3982bd758d2307db3492a2a844e27cbb6 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Thu, 21 May 2026 14:35:43 +0800 Subject: [PATCH] fix session --- Tun/Punchnet/Session/Session.swift | 36 ++++++++ Tun/Punchnet/Session/SessionSnapshot.swift | 27 ++++++ .../SessionTable.swift} | 83 ++++--------------- 3 files changed, 79 insertions(+), 67 deletions(-) create mode 100644 Tun/Punchnet/Session/Session.swift create mode 100644 Tun/Punchnet/Session/SessionSnapshot.swift rename Tun/Punchnet/{SessionManager.swift => Session/SessionTable.swift} (64%) diff --git a/Tun/Punchnet/Session/Session.swift b/Tun/Punchnet/Session/Session.swift new file mode 100644 index 0000000..7ab7ee4 --- /dev/null +++ b/Tun/Punchnet/Session/Session.swift @@ -0,0 +1,36 @@ +// +// Session.swift +// sdlan +// Session是增加了有效时间的 +// Created by 安礼成 on 2025/7/14. +// +import Foundation +import NIOCore + +struct Session { + enum AddressType: String, Hashable { + case v4 + case v6 + } + + // 在内部的通讯的ip地址, 整数格式 + let dstMac: Data + // 对端的主机在nat上映射的端口信息 + let natAddress: SocketAddress + // 当前会话对应的外层地址族 + let addressType: AddressType + + // 最后使用时间 + var lastTimestamp: Int32 + + init?(dstMac: Data, natAddress: SocketAddress, addressType: AddressType) { + self.dstMac = dstMac + self.natAddress = natAddress + self.addressType = addressType + self.lastTimestamp = Int32(Date().timeIntervalSince1970) + } + + mutating func updateLastTimestamp(_ lastTimestamp: Int32) { + self.lastTimestamp = lastTimestamp + } +} diff --git a/Tun/Punchnet/Session/SessionSnapshot.swift b/Tun/Punchnet/Session/SessionSnapshot.swift new file mode 100644 index 0000000..0cd4c23 --- /dev/null +++ b/Tun/Punchnet/Session/SessionSnapshot.swift @@ -0,0 +1,27 @@ +// +// SessionSnapshot.swift +// Tun +// +// Created by Codex on 2026/5/21. +// +import Foundation + +final class SessionSnapshot: Snapshot { + private let sessions: [Data: [Session.AddressType: Session]] + + init(sessions: [Data: [Session.AddressType: Session]]) { + self.sessions = sessions + } + + func getSession(toAddress: Data) -> Session? { + guard let peerSessions = self.sessions[toAddress] else { + return nil + } + + return peerSessions.values.max(by: { $0.lastTimestamp < $1.lastTimestamp }) + } + + static func empty() -> SessionSnapshot { + return SessionSnapshot(sessions: [:]) + } +} diff --git a/Tun/Punchnet/SessionManager.swift b/Tun/Punchnet/Session/SessionTable.swift similarity index 64% rename from Tun/Punchnet/SessionManager.swift rename to Tun/Punchnet/Session/SessionTable.swift index 2d19a36..0c35165 100644 --- a/Tun/Punchnet/SessionManager.swift +++ b/Tun/Punchnet/Session/SessionTable.swift @@ -1,64 +1,14 @@ // -// Session.swift -// sdlan -// Session是增加了有效时间的 -// Created by 安礼成 on 2025/7/14. +// SessionTable.swift +// Tun +// +// Created by Codex on 2026/5/21. // import Foundation -import NIOCore -import Darwin - -struct Session { - enum AddressType: String, Hashable { - case v4 - case v6 - } - - // 在内部的通讯的ip地址, 整数格式 - let dstMac: Data - // 对端的主机在nat上映射的端口信息 - let natAddress: SocketAddress - // 当前会话对应的外层地址族 - let addressType: AddressType - - // 最后使用时间 - var lastTimestamp: Int32 - - init?(dstMac: Data, natAddress: SocketAddress, addressType: AddressType) { - self.dstMac = dstMac - self.natAddress = natAddress - self.addressType = addressType - self.lastTimestamp = Int32(Date().timeIntervalSince1970) - } - - mutating func updateLastTimestamp(_ lastTimestamp: Int32) { - self.lastTimestamp = lastTimestamp - } -} - -final class SessionSnapshot: Snapshot { - private let sessions: [Data: [Session.AddressType: Session]] - - init(sessions: [Data: [Session.AddressType: Session]]) { - self.sessions = sessions - } - - func getSession(toAddress: Data) -> Session? { - guard let peerSessions = self.sessions[toAddress] else { - return nil - } - - return peerSessions.values.max(by: { $0.lastTimestamp < $1.lastTimestamp }) - } - - static func empty() -> SessionSnapshot { - return SessionSnapshot(sessions: [:]) - } -} actor SessionManager { private var sessions: [Data: [Session.AddressType: Session]] = [:] - + // session的有效时间 private let ttl: Int32 nonisolated private let snapshotPublisher: SnapshotPublisher @@ -68,54 +18,54 @@ actor SessionManager { self.ttl = ttl self.snapshotPublisher = SnapshotPublisher(initial: SessionSnapshot.empty()) } - + func getSession(toAddress: Data) -> Session? { let timestamp = Int32(Date().timeIntervalSince1970) - + guard var peerSessions = self.sessions[toAddress] else { return nil } - + peerSessions = peerSessions.filter { $0.value.lastTimestamp + ttl >= timestamp } guard !peerSessions.isEmpty else { self.sessions.removeValue(forKey: toAddress) self.publishSnapshot() return nil } - + guard var session = self.selectSession(in: peerSessions) else { self.sessions[toAddress] = peerSessions self.publishSnapshot() return nil } - + session.updateLastTimestamp(timestamp) peerSessions[session.addressType] = session - + self.sessions[toAddress] = peerSessions self.publishSnapshot() - + return session } func addSession(session: Session) { let timestamp = Int32(Date().timeIntervalSince1970) - + var sessions = self.sessions[session.dstMac, default: [:]] sessions = sessions.filter { $0.value.lastTimestamp + ttl >= timestamp && $0.key != session.addressType } sessions[session.addressType] = session - + self.sessions[session.dstMac] = sessions self.publishSnapshot() } - + func removeSession(dstMac: Data) { self.sessions.removeValue(forKey: dstMac) self.publishSnapshot() } - + func clear() { self.sessions.removeAll() self.publishSnapshot() @@ -141,5 +91,4 @@ actor SessionManager { } return SessionSnapshot(sessions: sessions) } - }