HTTP服务器(使用套接字)应该如何检测客户端不再连接并中止处理?

时间:2009-07-24 19:08:40

标签: http sockets tcp boost-asio

我正在使用boost :: asio。

在C ++中实现一个基本的HTTP Server

当我处理每个请求时,我会异步地以块的形式写出数据。如果在任何时候我知道客户端已不再连接,我想中止处理,例如如果客户不再存在,那么继续构建结果是没有意义的。

我认为这已经有过几次了,例如:

How can I check if a client disconnected through Winsock in C++?

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

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

2 个答案:

答案 0 :(得分:1)

如果客户端断开连接,则应该使用适当的错误代码使异步写入失败。当调用带有错误的完成处理程序时,则中止处理。

答案 1 :(得分:0)

有三件事需要考虑(虽然如何使用提升,我不知道)

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

  • 检测到客户端上的不干净关闭,write()最终应该失败,read()也会出错

然后就是客户刚刚消失的情况,或者是一个恶意慢的读者/作者,你必须实施;

  • 超时。如果一段时间没有活动,你应该扔掉连接。这也适用于您向客户端写一些东西。任何没有实现超时的网络读取或写入都会严重破坏,最终会泄漏资源(只要认为用户关闭笔记本电脑,拉动电缆,NAT网关默默地丢弃tcp连接,恶意用户不读取和阻止TCP转移等)。如果您无法控制异步写入过程,那么您将遇到麻烦。