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

如何解决websocket::stream::async_handshake自定义请求握手的密钥错误?

问题根源

Boost.Beast的async_handshake方法会自动生成Sec-WebSocket-Key,并且在验证服务器返回的Sec-WebSocket-Accept时,只会使用它自身生成的Key——哪怕你通过装饰器覆盖了请求头里的Sec-WebSocket-Key,Beast内部验证逻辑依然沿用最初生成的Key,导致计算出的预期Accept值和服务器返回的不匹配,最终触发错误。

解决方案:使用async_handshake_ex直接传入自定义请求

Beast提供了async_handshake_ex方法,允许你直接传入完整的自定义握手请求,此时Beast会使用你请求中的Sec-WebSocket-Key来验证服务器响应,不会再自动生成Key。

修改后的代码示例:

// request变量指向你从网络读取的、符合WebSocket握手规范的HTTP请求
// 确保请求包含Upgrade、Connection、Sec-WebSocket-Key、Sec-WebSocket-Version等必要头

// 无需设置decorator,直接用自定义请求发起握手
ws_.async_handshake_ex(*request,
    [this](boost::beast::error_code ec)
    {
        if (ec)
        {
            std::cout << ec.message() << std::endl;
            return;
        }
        // 握手成功,可开始WebSocket通信
    });
注意事项
  • 传入的request必须严格符合WebSocket客户端握手规范:必须包含Upgrade: websocket、Connection: Upgrade、Sec-WebSocket-Key、Sec-WebSocket-Version: 13这些字段,否则服务器会拒绝握手。
  • 如果原始请求缺少必要字段,需要手动补充后再传入async_handshake_ex。

内容的提问来源于stack exchange,提问作者Joe J

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:00:04