【问题标题】:TcpClient Memory LeakTcpClient 内存泄漏
【发布时间】:2014-06-05 23:35:08
【问题描述】:

我创建了一个完美运行的服务器。然而,当我决定针对 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,然后将其丢弃。

【问题讨论】:

  • 您有问题吗?
  • 编辑了帖子 - 添加了问题。
  • 顺便说一句。虽然与您的问题无关,但如果拥有 IPV6 地址的人连接的地址与其中存在的 : 一样多,您的服务将失败。
  • @ScottChamberlain 我计划在完成核心功能后添加 IPV6 支持。
  • 只需将EndPoint 转换为IPEndPoint 并使用Address 属性。在the documentation of RemoteEndPoint 中说要做到这一点(参见“备注”的第一段)

标签: c# networking memory-leaks tcpclient connection


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您永远不会从IpByConnection 中删除连接,因此随着列表中的连接会越来越大,您需要一些方法来将失败或关闭的连接从该集合中删除。这并非特定于 DDoS 攻击,您的程序会在数周/数月后因同样的原因而崩溃,而不会因同样的原因重新启动,只是发生速度较慢。

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

    【讨论】:

    • 我已经调试了代码。它添加一次连接,然后 if 语句停止再次添加它。 hastable 的计数仍然为 1。
    • @Brodie 是的,问题不在于一遍又一遍的同一个连接。问题是如果有 200 万个 不同的 IP 连接(这在 DDoS 攻击中会发生),程序将在 HastSet 中有 200 万个对象,并且有您没有显示任何内容会导致这些对象被删除。如果它们在哈希集中,将其设置为null 并尝试进行垃圾收集将无济于事,因为对象已被收集“植根”,因此在垃圾收集期间没有资格被删除。
    • 我认为这是另一个问题,但现在它们都来自 127.0.0.1,我想知道是什么原因造成的。我明白你的意思,一旦我明白为什么这会从同一个 IP 泄漏,我确实有一个解决方案。并且它不会不断地将其添加到 HashTable 中。
    • 嗯 127.0.0.1 你自己电脑上的环回地址,你是连接到你自己的吗?如果您键入指向127.0.0.1localhost,如果您使用其他东西,许多网络驱动程序足够聪明,不会将数据包放在网络上,并且如果它看到它正在与自己对话,则将其重定向到本地主机。最后,你为什么要在这个时代处理套接字?有许多优秀的库 (WCF) 可以将所有这些抽象出来,甚至处理负载平衡以帮助应对 DDoS 攻击。另一个注意事项,你一直说HashTable 不要使用那个,你应该使用Dictionary
    • 然后发布您自己的答案并接受它或删除您的问题。请不要只留下一个没有答案的问题(并且没有足够的细节让任何人留下答案)
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2013-01-20
    • 2011-10-31
    • 2019-08-10
    • 2013-06-24
    • 2011-03-22
    相关资源
    最近更新 更多