TcpClient内存泄漏

本文关键字:泄漏 内存 TcpClient | 更新日期: 2023-09-27 18:07:03

我已经创建了一个工作完美的服务器。然而,当我决定对它进行DDoS攻击测试时,我发现了一个主要的内存泄漏。下面的代码将填满RAM(当DDoS攻击时)并最终使我的计算机崩溃。我已经尝试实施反措施,但内存泄漏仍然存在。我当前的监听代码是:

TcpClient connection = server.AcceptTcpClient();
if (!IpByConnection.ContainsKey(connection.Client.RemoteEndPoint.ToString().Split(':')[0])) {
    IpByConnection.Add(connection.Client.RemoteEndPoint.ToString().Split(':')[0], connection);
    CipherNetwork network = new CipherNetwork(connection);
    network.ListenOnDifferentThread(true);
    network.DisconnectOnError(true);
    network.StartListening();
    TotalConnections += 1;
} else {
    connection.Close();
}

如何修复这个内存泄漏?

编辑:我忘了说,这个方法是在一个单独的线程上运行的。编辑2:我已经尝试将其设置为null,处理它和两者。

TcpClient内存泄漏

我无法找到一个直接的解决方案,但我设法通过限制每个IP的每个连接5来解决问题,使用字典存储连接的用户,并在断开连接后将其删除。

您永远不会从IpByConnection中删除连接,因此随着列表中的连接变得越来越大,您需要一些方法将失败或关闭的连接从该集合中删除。这不是针对DDoS攻击的,你的程序会在几周/几个月后因为同样的原因崩溃,而不会因为同样的原因重新启动,它只是发生得更慢。

如何删除这些对象取决于您对该连接所做的操作,以决定何时"完成"并将其从集合中删除