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
相关产品推荐
相关产品推荐

