如何获取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
相关产品推荐
相关产品推荐

