我正在使用非阻塞套接字将文件从服务器传输到客户端。有些文件可能很大(数百兆字节)。一个单独的线程处理每个客户端。
poll()
有时ECONNRESET
超时并且服务器关闭连接(以防止恶意客户端耗尽服务器资源)。我发现即使客户端仍在尝试读取数据,也会发生这种情况。在这种情况下,客户在致电read()
时会获得TIMEOUT
。
我发现服务器反复发送一些文件块,并且在某些时候套接字可能仍然没有准备好写几秒钟。我假设这是因为尚未发送数据并且相应的内核缓冲区已满。但是,这会导致超时,导致服务器关闭连接。
当我增加{{1}}的值时,错误发生的次数减少了。确保意外超时不会发生的最佳方法是什么?
服务器应该在多个平台上运行,因此我无法真正使用特定于操作系统的解决方案。
答案 0 :(得分:3)
你永远无法完全抵御DOS攻击和意外超时。
我建议您使用已发送的数据量缩放允许的超时。从shart超时开始,并在发送越来越多的数据时增加它。
DOS攻击者和已经失效的客户可能会打开许多连接,但不会打扰他们。你想快速关闭这种连接。应该允许已经收到数十或数百MB数据的客户更多超时。
示例: