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

Boost::beast ssl_stream共享指针无法解引用 转websocket::stream报错求助

问题根因
  • 第一次代码报错的核心原因是构造websocket::stream时多余传入了SSL上下文参数:你要将已经完成握手的ssl_stream直接作为下层流塞入websocket::stream,对应构造函数只需要接收移动后的ssl_stream实例,不需要再传入SSL上下文。多余的参数导致编译器匹配到了错误的构造函数分支,触发了ssl_stream被删除的拷贝构造逻辑,因此报C2280错误。
  • 第二次调整代码报错的原因是你移动了ssl_stream的下层tcp_stream:该操作会把TCP套接字从已经完成握手的ssl_stream实例中剥离,新构造的websocket::stream内部的ssl_stream是全新初始化的,丢失了之前的SSL握手状态,因此调用async_accept时会抛出套接字未初始化的错误。
修复方案

直接删除构造时多余的SSL上下文参数即可,调整后的代码如下:

void async_ws_client::add_stream(std::shared_ptr<boost::beast::ssl_stream<boost::beast::tcp_stream>>&& ptls_stream)
{   
    if (m_ptls_context)
    {       
        m_p_wss_stream = std::make_shared<
            boost::beast::websocket::stream<
            boost::beast::ssl_stream<
            boost::beast::tcp_stream>>>(std::move(*ptls_stream));
    }
}
注意事项
  • 上述代码执行后,原来的ptls_stream指向的ssl_stream实例处于移后可析构状态,后续不要再对其进行任何读写操作,它的所有内部资源已经全部转移到m_p_wss_stream内部的ssl_stream实例中。
  • 不需要再对m_p_wss_stream内部的SSL层做握手操作,之前的HTTPS处理逻辑已经完成了SSL握手,直接调用websocket::stream的async_accept处理Websocket升级握手即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:39:03