7

在 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 会话处于打开状态的报告。

4

1 回答 1

13

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

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/不干净的断开连接错误或超时错误。您的本地操作系统可能会保持套接字打开以及占用资源或端口。您的本地 WebSocket++ 连接都将立即使用不干净的断开关闭代码调用其关闭/失败处理程序。

于 2014-08-12T13:48:08.137 回答