如何在CPPRest SDK中设置WebSocket连接超时?
CPPRest SDK WebSocket连接超时设置方案
由于websocket_client_config确实没有内置的超时配置项,你需要通过pplx::task的异步机制来实现连接超时终止,以下是两种可靠的实现方式:
方法1:使用pplx::task::wait_for
通过设置任务等待的超时阈值,超时后主动终止客户端连接:
#include <cpprest/ws_client.h> #include <pplx/pplxtasks.h> void connect_with_timeout() { web::websockets::client::websocket_client client; web::websockets::client::websocket_client_config config; // 按需配置config参数... auto connect_task = client.connect(U("ws://your-websocket-server-url"), config); // 设置超时时间(示例为5秒) auto wait_result = connect_task.wait_for(std::chrono::seconds(5)); if (wait_result == pplx::task_status::completed) { // 连接成功,执行后续逻辑 std::cout << "连接成功" << std::endl; } else { // 超时或任务中断,主动清理客户端资源 client.close(); std::cout << "连接超时" << std::endl; } }
方法2:使用pplx::when_any结合超时任务
适合异步场景,无需阻塞主线程:
#include <cpprest/ws_client.h> #include <pplx/pplxtasks.h> pplx::task<void> connect_with_async_timeout() { web::websockets::client::websocket_client client; web::websockets::client::websocket_client_config config; // 按需配置config参数... auto connect_task = client.connect(U("ws://your-websocket-server-url"), config); // 创建5秒后触发的超时任务 auto timeout_task = pplx::create_task([]() { pplx::wait(std::chrono::seconds(5)); throw std::runtime_error("连接超时"); }); // 等待任意一个任务完成 return pplx::when_any(connect_task, timeout_task) .then([&client](pplx::task<pplx::task<void>> antecedent) { try { auto completed_task = antecedent.get(); completed_task.get(); // 获取任务结果,超时会抛出异常 std::cout << "连接成功" << std::endl; } catch (const std::runtime_error& e) { // 处理超时逻辑 client.close(); std::cout << e.what() << std::endl; } catch (const std::exception& e) { // 处理其他连接异常 std::cout << "连接失败: " << e.what() << std::endl; } }); }
注意事项
- 超时后必须调用
websocket_client::close()清理资源,避免内存泄漏。 - 异步场景下要保证客户端对象的生命周期覆盖任务执行全程,防止提前析构导致异常。
内容的提问来源于stack exchange,提问作者the.cicada.himself
相关产品推荐
相关产品推荐

