gpt4 book ai didi

websocket++ - 关闭 websocket++ 连接

转载 作者:行者123 更新时间:2023-12-04 07:09:15 48 4
gpt4 key购买 nike

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

最佳答案

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

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++ 连接都将立即使用不干净的断开关闭代码调用其关闭/失败处理程序。

关于websocket++ - 关闭 websocket++ 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25260852/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com