【发布时间】: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