【问题标题】:boost asio notify server of disconnectboost asio 通知服务器断开连接
【发布时间】:2016-08-23 13:46:52
【问题描述】:

我想知道是否有任何方法可以在客户端应用程序关闭时通知服务器。通常,如果我 Ctrl+C 我的客户端终端 EOF-signal 将发送到服务器端。服务器端 async_read 函数有一个句柄,其中有 boost::system::error_code ec 参数。当服务器端收到EOF-signal 时调用该句柄,我可以愉快地处理并告诉服务器再次开始监听。

但是,如果我尝试使用 socket.shutdown()socket.close() 干净地关闭我的客户端应用程序,则不会发生任何事情并且服务器端套接字保持打开状态。

我想知道,有没有办法以某种方式向服务器端套接字发送错误信号,以便我可以使用错误代码对其进行处理?

【问题讨论】:

  • 如果您的读取处理程序以 bytes_read = 0 调用,这通常意味着连接接收到RST 或通道关闭(在 TCP 中)。你可以在此基础上做一些事情。
  • asio::ip::tcp::socket 的析构函数隐式调用shutdown() 后跟close()。如果您关闭客户端,您的服务器肯定会收到 EOF 错误。还有其他问题。
  • 啊是的 - 就是这样。 async_read_some 可以通过零字节读取返回成功。这表示 EOF 条件。
  • 那个有点棘手。看来我在编写单元测试时犯了一个错误,当我优雅地终止应用程序时确实生成了 EOF 信号。但是,强制终止程序使我感到困惑,正如下面答案中所指出的那样,该程序不会通知服务器任何事情。在这种情况下,“ping”功能是必要的。

标签: c++ linux boost boost-asio


【解决方案1】:

cmets 中描述的方法涵盖了 99% 的情况。当客户端计算机(不正常)关闭或网络问题时,它不起作用。

要获得断开客户端的可靠通知,您需要实现“ping”功能:定期发送 ping 数据包并检查您是否收到了 pong 数据包。

【讨论】:

  • 是的,这也是我的担忧之一,即如果有人简单地强行关闭计算机,除非我实现 ping 功能,否则服务器不会收到通知,就像你说的那样。至于其余的,cmets 来拯救这一天。
  • keepalive 不能处理吗?
  • @AndyT 酷。我不知道。 +1
猜你喜欢
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多