You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# Socket:如何统计客户端每分钟连接服务器的次数?

实现单IP每分钟连接次数统计方案

要实现单用户(按IP区分)每分钟连接次数的统计并限制,你需要替换当前仅检查在线用户数量的逻辑,改为追踪每个IP的连接时间戳并过滤过期记录,具体实现步骤如下:

核心思路

  • 维护一个全局字典,存储每个IP对应的所有连接时间戳
  • 每次新连接时,先清理该IP下超过1分钟的旧记录(只保留最近60秒内的连接记录)
  • 统计剩余记录的数量,若超过设定阈值则拒绝连接,否则将当前时间戳加入列表

修改后的代码实现

首先在全局或Core类中添加存储结构:

// 全局存储IP与对应连接时间戳的字典,需保证线程安全(可加锁或用ConcurrentDictionary)
private static Dictionary<string, List<DateTime>> _ipConnectionTimestamps = new Dictionary<string, List<DateTime>>();
private static object _lockObj = new object(); // 线程安全锁

然后替换你原有的连接判断逻辑:

lock (_lockObj)
{
    // 获取当前IP的连接时间列表,不存在则创建新列表
    if (!_ipConnectionTimestamps.TryGetValue(IP, out var timestamps))
    {
        timestamps = new List<DateTime>();
        _ipConnectionTimestamps[IP] = timestamps;
    }

    // 清理超过1分钟的旧连接记录
    timestamps.RemoveAll(t => DateTime.Now.Subtract(t).TotalSeconds > 60);

    // 检查最近1分钟内的连接次数是否超过阈值(示例设为10)
    if (timestamps.Count >= 10)
    {
        _Socket.Dispose();
        return; // 拒绝连接
    }

    // 将当前连接时间加入列表
    timestamps.Add(DateTime.Now);
}

关键细节说明

  • 线程安全:如果你的Socket服务器是多线程处理连接,必须加锁或使用ConcurrentDictionary,避免多线程操作字典时出现异常
  • 内存优化:定期清理所有IP的过期记录(比如定时任务),防止字典中积累大量无用的旧IP数据
  • 阈值调整:根据实际服务器性能,修改10这个阈值为合理的连接次数上限

内容的提问来源于stack exchange,提问作者DeluxoC2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 22:40:43