当使用带有ASIO模式的Websocket ++时,我开始连接:
boost::shared_ptr<client> x(new client());
x->init_asio();
websocketpp::lib::error_code ec;
client::connection_pt con = x->get_connection(url, ec);
x->connect(con);
new thread(boost::bind(&LocalCallbacks::run, x)); // which just runs x->run()
从提供的示例中复制(修改)此模式。当用户按下按钮取消websocket时,我应该如何正确清理?我现在正在做:
x->stop();
我是否也应该致电x->close()
?在致电close
之前,我是否需要在致电stop
后等待?我是否需要杀死已创建的thread
,还是会自动停止?我有关于当前代码离开websocket会话的报告。
答案 0 :(得分:11)
以下教程中描述了干净地关闭客户端端点的理想方法:
简而言之,您不是关闭端点,而是通过con->close()
关闭连接。这将干净地执行WebSocket和TCP关闭握手(具有可配置的超时,以确保恶意或损坏的客户端不会永远挂起)。
在端点上运行的所有连接都关闭后,端点将停止运行并返回其run()方法。 (在永久模式的情况下除外。如果使用永久模式,请在关闭连接之前将其关闭)。因此,在关闭连接之后,可以在运行端点的线程上使用thread.join()
,等待它们全部关闭。
这个过程不是即时的,因为它需要一些网络往返来清理一切。如果您因任何原因必须立即结束 ,请致电endpoint.stop()
。这将立即停止处理io_service作业。这将使所有现有连接处于不稳定状态。 WebSocket连接似乎没有在另一端关闭,但是当它们尝试写入时,它们将会出现TCP / unclean断开连接错误或超时错误。您的本地操作系统可能会保持套接字打开以及占用资源或端口。您本地的WebSocket ++连接将立即使用不干净的断开连接代码调用其关闭/失败处理程序。