vcpkg 与 CMake 集成细节:使用 Boost.Asio 实现 AsyncWebSocket
环境准备
确保已安装最新版 CMake(3.15+)和 vcpkg。通过以下命令安装 Boost 及 Asio 组件:
vcpkg install boost-asio
需在项目根目录初始化 vcpkg 的 CMake 工具链文件,例如:
cmake -B build -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake
CMake 项目配置
在 CMakeLists.txt 中声明对 Boost.Asio 的依赖:
find_package(Boost REQUIRED COMPONENTS system)
target_link_libraries(your_project PRIVATE Boost::boost Boost::system)
若需启用 C++17 协程支持,添加编译选项:
target_compile_features(your_project PRIVATE cxx_std_17)
AsyncWebSocket 实现
创建 WebSocket 服务器类,继承 boost::asio::ip::tcp::socket。核心代码片段如下:
class WebSocketSession : public std::enable_shared_from_this<WebSocketSession> {
boost::asio::ip::tcp::socket socket_;
boost::beast::flat_buffer buffer_;
public:
explicit WebSocketSession(boost::asio::ip::tcp::socket socket)
: socket_(std::move(socket)) {}
void run() {
boost::asio::co_spawn(
socket_.get_executor(),
[self = shared_from_this()]{ return self->echo(); },
boost::asio::detached);
}
boost::asio::awaitable<void> echo() {
try {
websocket::stream<boost::asio::ip::tcp::socket> ws{std::move(socket_)};
co_await ws.async_accept(boost::asio::use_awaitable);
for(;;) {
auto bytes = co_await ws.async_read(buffer_, boost::asio::use_awaitable);
co_await ws.async_write(buffer_.data(), boost::asio::use_awaitable);
buffer_.consume(bytes);
}
} catch(...) {}
}
};
服务端启动逻辑
在 main 函数中初始化 ASIO 的 io_context 并监听端口:
boost::asio::io_context ioc;
boost::asio::ip::tcp::acceptor acceptor{ioc, {boost::asio::ip::tcp::v4(), 8080}};
boost::asio::co_spawn(ioc, listener(std::move(acceptor)), boost::asio::detached);
ioc.run();
依赖管理技巧
建议在 vcpkg 中固定 Boost 版本以避免兼容性问题,通过修改 vcpkg.json:
{
"dependencies": [
{
"name": "boost-asio",
"version>=": "1.82.0"
}
]
}
调试与优化
启用 ASIO 的调试日志可添加编译定义:
add_compile_definitions(BOOST_ASIO_ENABLE_HANDLER_TRACKING)
对于高性能场景,建议在 CMake 中开启链接时优化:
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)

被折叠的 条评论
为什么被折叠?



