using LiteNetLib; namespace ServerLib.Service; public class Session { public string? Token { get; set; } public long HashKey { get; init; } public NetPeer Peer { get; set; } // ─── 패킷 레이트 리미팅 ─────────────────────────── private int packetCount; private long windowStartTicks; /// 초당 허용 패킷 수 public int MaxPacketsPerSecond { get; set; } /// 연속 초과 횟수 public int RateLimitViolations { get; private set; } /// /// 패킷 수신 시 호출. 초당 제한 초과 시 true 반환. /// public bool CheckRateLimit() { long now = Environment.TickCount64; // 1초(1000ms) 윈도우 초과 시 리셋 if (now - windowStartTicks >= 1000) { windowStartTicks = now; packetCount = 0; } packetCount++; if (packetCount > MaxPacketsPerSecond) { RateLimitViolations++; return true; // 제한 초과 } return false; } /// 위반 카운트 초기화 public void ResetViolations() { RateLimitViolations = 0; } public Session(long hashKey, NetPeer peer, int maxPacketsPerSecond = 60) { HashKey = hashKey; Peer = peer; Token = null; MaxPacketsPerSecond = maxPacketsPerSecond; packetCount = 0; windowStartTicks = Environment.TickCount64; RateLimitViolations = 0; } }