0

我正在使用 boost::asio 在 C++ 中实现一个基本的 HTTP 服务器。

在处理每个请求时,我会以异步方式将数据分块写入。如果在任何时候我知道客户端不再连接,我想中止处理,例如,如果客户端不再存在,则继续构建结果以发送出去是没有意义的。

我认为这已经在这里被问过几次了,例如:

如何检查客户端是否通过 C++ 中的 Winsock 断开连接?

但是我读了它们,我仍然不确定这里有什么好的方法。

  • 我可以尝试从客户端套接字读取吗?(即使知道另一端的 HTTP 客户端不会发送任何数据)
  • 因为我正在异步编写(使用 boost::asio::async_write),所以如果客户端不再存在,我似乎不会收到反馈
4

2 回答 2

1

如果客户端断开连接,您应该让异步写入失败并显示适当的错误代码。当您的完成处理程序因错误而被调用时,则中止处理。

于 2009-07-24T19:17:29.710 回答
0

有 3 件事需要考虑(尽管我不知道如何使用 boost 来完成)

  • 从客户端检测干净的关闭。这是由客户端的 read() 完成的。返回 0 的读取意味着另一端已关闭连接,如果您正在实施 http 管道,您可能必须继续从客户端读取。

  • 检测到客户端的不正常关机,write() 最终会失败,read() 也会出错

然后在中间的情况下,客户端只是消失了,或者是一个恶意的慢读/写器,你必须实现;

  • 超时。如果一段时间内没有活动,您应该丢弃连接。这也适用于您向客户写一些东西。任何没有实现超时的网络读写都会被严重破坏,最终会导致资源泄漏(想想用户关闭笔记本、拔电缆、NAT 网关默默地丢弃 tcp 连接、恶意用户不读取并阻止TCP 传输等)。如果您无法控制异步写入过程,那么您将在这里遇到麻烦。
于 2009-07-24T19:32:45.670 回答