You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 05:30:47