关闭websocket ++连接

时间:2014-08-12 09:32:13

标签: websocket++

当使用带有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会话的报告。

1 个答案:

答案 0 :(得分:11)

以下教程中描述了干净地关闭客户端端点的理想方法:

https://github.com/zaphoyd/websocketpp/blob/master/tutorials/utility_client/utility_client.md#close-all-outstanding-connections-in-websocket_endpoint-destructor

简而言之,您不是关闭端点,而是通过con->close()关闭连接。这将干净地执行WebSocket和TCP关闭握手(具有可配置的超时,以确保恶意或损坏的客户端不会永远挂起)。

在端点上运行的所有连接都关闭后,端点将停止运行并返回其run()方法。 (在永久模式的情况下除外。如果使用永久模式,请在关闭连接之前将其关闭)。因此,在关闭连接之后,可以在运行端点的线程上使用thread.join(),等待它们全部关闭。

这个过程不是即时的,因为它需要一些网络往返来清理一切。如果您因任何原因必须立即结束 ,请致电endpoint.stop()。这将立即停止处理io_service作业。这将使所有现有连接处于不稳定状态。 WebSocket连接似乎没有在另一端关闭,但是当它们尝试写入时,它们将会出现TCP / unclean断开连接错误或超时错误。您的本地操作系统可能会保持套接字打开以及占用资源或端口。您本地的WebSocket ++连接将立即使用不干净的断开连接代码调用其关闭/失败处理程序。