在两个对等体之间传输文件时防止超时

时间:2017-12-14 12:37:59

标签: c sockets

我正在使用非阻塞套接字将文件从服务器传输到客户端。有些文件可能很大(数百兆字节)。一个单独的线程处理每个客户端。

poll()

有时ECONNRESET超时并且服务器关闭连接(以防止恶意客户端耗尽服务器资源)。我发现即使客户端仍在尝试读取数据,也会发生这种情况。在这种情况下,客户在致电read()时会获得TIMEOUT

我发现服务器反复发送一些文件块,并且在某些时候套接字可能仍然没有准备好写几秒钟。我假设这是因为尚未发送数据并且相应的内核缓冲区已满。但是,这会导致超时,导致服务器关闭连接。

当我增加{{1}}的值时,错误发生的次数减少了。确保意外超时不会发生的最佳方法是什么?

服务器应该在多个平台上运行,因此我无法真正使用特定于操作系统的解决方案。

1 个答案:

答案 0 :(得分:3)

你永远无法完全抵御DOS攻击和意外超时。

我建议您使用已发送的数据量缩放允许的超时。从shart超时开始,并在发送越来越多的数据时增加它。

DOS攻击者和已经失效的客户可能会打开许多​​连接,但不会打扰他们。你想快速关闭这种连接。

应该允许已经收到数十或数百MB数据的客户更多超时。

示例:

  • 初始:500毫秒
  • 1 MB后:2 s
  • 100 MB后:10秒