boost.beast是基于boost.asio的轻量http/https库,纯头文件、无需编译,支持同步/异步模型;示例实现单线程http服务器,监听8080端口并返回html响应,需调用prepare_payload()设置长度或分块编码。

用 C++ 实现一个简单的 HTTP 服务器,Boost.Beast 是目前最实用、最贴近底层又足够易用的选择。它基于 Boost.Asio 构建,专为 HTTP/HTTPS 和 WebSocket 设计,不依赖外部 OpenSSL(可选),代码清晰,适合学习和轻量部署。
准备工作:环境与依赖
确保已安装 Boost 1.70 或更高版本(Beast 自 1.70 起正式集成进 Boost 主干)。不需要单独编译 Beast —— 它是纯头文件库,只要包含路径正确即可使用。
- Linux/macOS:推荐用 Boost 1.84+(最新稳定版),通过包管理器或源码安装
- Windows:可用 vcpkg:
vcpkg install boost-beast - 编译时需链接 boost_system(Asio 底层依赖),命令示例:
g++ -std=c++17 server.cpp -lboost_system -lpthread -o server
核心结构:同步 HTTP 服务器示例
以下是一个最小可运行的同步 HTTP 服务器(单线程、阻塞式),监听 8080 端口,返回固定 HTML 响应:
#include <boost/beast/core.hpp>
#include <boost/beast/http.hpp>
#include <boost/beast/version.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio.hpp>
#include <iostream>
#include <string>
namespace beast = boost::beast;
namespace http = beast::http;
namespace net = boost::asio;
using tcp = net::ip::tcp;
void handle_request(http::request<http::string_body>& req,
http::response<http::string_body>& res) {
// 简单路由:只处理 GET /
if (req.method() == http::verb::get && req.target() == "/") {
res.result(http::status::ok);
res.set(http::field::content_type, "text/html");
res.body() = "<h1>Hello from Boost.Beast!</h1>";
res.prepare_payload();
} else {
res.result(http::status::not_found);
res.set(http::field::content_type, "text/plain");
res.body() = "404 Not Found";
res.prepare_payload();
}
}
void do_session(tcp::socket& socket) {
try {
beast::flat_buffer buffer;
http::request<http::string_body> req;
http::read(socket, buffer, req);
http::response<http::string_body> res;
handle_request(req, res);
http::write(socket, res);
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << "\n";
}
}
int main() {
net::io_context ioc;
tcp::acceptor acceptor(ioc, tcp::endpoint(tcp::v4(), 8080));
while (true) {
tcp::socket socket(ioc);
acceptor.accept(socket);
do_session(socket);
}
}
关键点说明
-
beast::flat_buffer:高效内存缓冲区,避免频繁分配,必须传给
http::read -
http::request / response 模板参数指定 body 类型,
string_body最常用;若需流式响应,可用file_body或自定义 body -
res.prepare_payload():必须调用!它自动设置
Content-Length或启用 chunked 编码 -
同步 vs 异步:上面是同步版本(适合教学);生产环境建议用异步(
async_read/async_write+ `net::co_spawn` 协程更简洁)
下一步建议
- 把
do_session改成异步函数,配合net::co_spawn实现协程式处理(C++20) - 添加静态文件服务:用
http::file_body直接返回磁盘文件 - 支持 POST 表单解析:读取
req.body()或用http::parser分析 multipart - 加日志、连接超时、Keep-Alive 控制(设置
res.keep_alive(true))
不复杂但容易忽略:Beast 的 HTTP 类型是值语义,请求/响应对象默认不可重用,每次会话都应新建;同时注意 buffer 生命周期不能短于 read/write 调用。
立即学习“C++免费学习笔记(深入)”;











