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

如何获取Boost.Beast中TCP-SSL型websocket::stream的使用端口?

获取Boost Beast WebSocket流底层套接字的端口号

针对你嵌套了ssl_stream和tcp_stream的WebSocket流实例,正确获取底层端口号的方法如下:

方法一:直接调用lowest_layer()获取最底层流

如果编译器允许,直接通过lowest_layer()跳过中间层,直接拿到最底层的tcp_stream,再获取其套接字的端点信息:

// 假设你的WebSocket流实例名为ws
auto& tcp_stream = ws.lowest_layer();
// 获取本地端口
boost::asio::ip::tcp::endpoint local_endpoint = tcp_stream.socket().local_endpoint();
uint16_t local_port = local_endpoint.port();

// 若需获取远程端口
boost::asio::ip::tcp::endpoint remote_endpoint = tcp_stream.socket().remote_endpoint();
uint16_t remote_port = remote_endpoint.port();

方法二:逐层调用next_layer()(适配部分Boost版本)

如果lowest_layer()编译报错,可逐层向下获取中间流,最终拿到tcp_stream:

// 逐层获取底层流
auto& ssl_stream = ws.next_layer();
auto& tcp_stream = ssl_stream.next_layer();
// 获取本地端口
boost::asio::ip::tcp::endpoint local_endpoint = tcp_stream.socket().local_endpoint();
uint16_t local_port = local_endpoint.port();

注意事项

  • 必须确保套接字已处于连接状态,否则调用local_endpoint()或remote_endpoint()会抛出boost::system::system_error异常。若需避免异常,可使用带错误码的重载版本:
boost::system::error_code ec;
auto local_endpoint = ws.lowest_layer().socket().local_endpoint(ec);
if (!ec) {
    uint16_t local_port = local_endpoint.port();
    // 处理端口号逻辑
} else {
    // 处理错误,比如套接字未连接
}
  • 检查Boost版本兼容性,部分旧版本Beast可能需要依赖逐层调用next_layer()的方式,而非直接使用lowest_layer()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 21:53:12