当在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会话处于打开状态。
发布于 2014-08-12 13:48:08
在下面的教程中,这里描述了彻底关闭客户端点的理想方法:
简而言之,与其关闭端点,不如通过con->close()关闭连接。这将清晰地执行WebSocket和TCP关闭握手(使用可配置的超时以确保恶意或损坏的客户端不会永远挂起)。
一旦关闭了在端点上运行的所有连接,端点就停止运行,并且它的run()方法返回。(永久模式除外)如果您正在使用永久模式,请在关闭连接之前关闭它)。因此,您可以在关闭连接后运行端点的线程上使用thread.join(),等待连接全部关闭。
这个过程不是即时的,因为它需要几个网络往返来清理所有的东西。如果您必须立即结束,则调用,然后调用endpoint.stop()。这将立即停止处理io_service作业。这将使所有现有连接处于模糊状态。WebSocket连接在另一端似乎没有关闭,但是当它们试图写入时,它们将得到一个损坏的TCP /不干净的断开连接错误或超时错误。您的本地操作系统也可以保持套接字打开,还可以绑定资源或端口。本地WebSocket++连接将立即使用不干净的断开关闭代码调用它们的关闭/失败处理程序。
https://stackoverflow.com/questions/25260852
复制相似问题