0

0

如何用c++实现一个简单的HTTP服务器? (基于Boost.Beast)

冰火之心

冰火之心

发布时间:2026-01-10 12:29:02

|

952人浏览过

|

来源于php中文网

原创

因为C++23的std::net尚未实现且编译器不支持,而Boost.Beast是当前最稳定、文档最全、基于Asio的HTTP库,提供语义清晰的http::request/response类型,避免手动解析。

如何用c++实现一个简单的http服务器? (基于boost.beast)

为什么不用 std::net 而选 Boost.Beast?

因为 C++23 的 std::net 还没实装,主流编译器全不支持;Boost.Beast 是目前最稳定、文档最全、基于 Asio 的 HTTP 实现。它不封装底层 socket,但提供 http::request / http::response 等语义清晰的类型,避免手动解析状态行和 header。

最简同步 HTTP 服务器长什么样?

只响应 GET /,返回固定 HTML,无路由、无并发、不处理 POST —— 适合验证环境或嵌入式调试。关键点是:用 tcp::acceptor 监听,http::read 解析请求,http::write 发送响应,最后 socket.shutdown() 避免 FIN_WAIT2 积压。

#include 
#include 
#include 
#include 
#include 
#include 

namespace http = boost::beast::http;
namespace net = boost::asio;
using tcp = net::ip::tcp;

int main() {
    net::io_context ioc;
    tcp::acceptor acceptor{ioc, {tcp::v4(), 8080}};
    
    while (true) {
        tcp::socket socket{ioc};
        acceptor.accept(socket);
        
        boost::beast::flat_buffer buffer;
        http::request req;
        http::read(socket, buffer, req);
        
        http::response res{http::status::ok, req.version()};
        res.set(http::field::server, "Boost.Beast");
        res.set(http::field::content_type, "text/html");
        res.body() = "

Hello from Beast

"; res.prepare_payload(); http::write(socket, res); socket.shutdown(tcp::socket::shutdown_send); } }

常见崩溃点:忘记 prepare_payload() 或漏掉 shutdown

不调用 res.prepare_payload()Content-Length 不会自动计算,浏览器可能卡住等待 body;不调用 socket.shutdown(),连接停留在 CLOSE_WAIT,Linux 下很快耗尽文件描述符。另外:http::read 默认只读一次,遇到分块传输或大请求会截断 —— 生产环境必须用 http::parser 并循环 parse

SUN2008 企业网站管理系统2.0 beta
SUN2008 企业网站管理系统2.0 beta

1、数据调用该功能使界面与程序分离实施变得更加容易,美工无需任何编程基础即可完成数据调用操作。2、交互设计该功能可以方便的为栏目提供个性化性息功能及交互功能,为产品栏目添加产品颜色尺寸等属性或简单的留言和订单功能无需另外开发模块。3、静态生成触发式静态生成。4、友好URL设置网页路径变得更加友好5、多语言设计1)UTF8国际编码; 2)理论上可以承担一个任意多语言的网站版本。6、缓存机制减轻服务器

下载
  • http::read 是阻塞式,别在高并发场景直接用
  • 响应体超过几 KB 时,flat_buffer 默认 512 字节不够,需传入更大 buffer
  • Windows 上监听 INADDR_ANY 可能被防火墙拦截,建议显式 bind tcp::v4()

想加 HTTPS?别硬改 Beast

Beast 本身不处理 TLS 握手,得套一层 ssl::stream<:socket>。但证书加载、SNI、ALPN 协商逻辑复杂,容易配错导致 handshake_failed。更稳妥的做法是前端nginx 做反向代理,或直接换用 cpp-httplib(内置 OpenSSL 封装)—— Beast 的优势在协议层控制力,不在开箱即用。

立即学习C++免费学习笔记(深入)”;

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

229

2023.07.27

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

495

2023.08.04

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

498

2023.08.04

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

227

2024.02.23

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

332

2024.07.09

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

3507

2024.08.07

html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

603

2023.06.14

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

644

2023.06.21

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

25

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.9万人学习

Git 教程
Git 教程

共21课时 | 2.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号