0

0

c++如何实现简单的HTTP服务器_c++ socket监听与请求解析【实战】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-12-27 14:29:02

|

245人浏览过

|

来源于php中文网

原创

监听端口前需设socket为非阻塞或用select/poll避免accept阻塞;bind前须setsockopt启用SO_REUSEADDR;HTTP解析须按\r\n切分、状态机处理TCP流式数据;响应必须严格遵循HTTP格式,含正确Content-Length与\r\n分隔。

c++如何实现简单的http服务器_c++ socket监听与请求解析【实战】

socket 监听端口前必须设为非阻塞或正确处理 accept 阻塞

默认 socket 是阻塞的,accept() 会卡住主线程,无法响应其他连接或做请求解析。不加处理就写个死循环调 accept,服务器看起来“启动了”,但实际只能服务一个请求,后续连接全被丢弃或超时。

  • 推荐方式:调用 fcntl(sockfd, F_SETFL, O_NONBLOCK)(Linux/macOS)或 ioctlsocket(sockfd, FIONBIO, &nonblocking)(Windows)设为非阻塞
  • 更稳妥的做法是搭配 select()poll() 等待可读事件,避免忙轮询;简单 demo 可先用阻塞模式 + 多线程,但生产环境必须异步或事件驱动
  • 监听 socket 必须先 bind()listen(),且 bind() 前要 setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)),否则改代码重启时经常报 Address already in use

HTTP 请求行和头部必须按 \r\n 切分,不能只认 \n

HTTP/1.1 规范明确要求行尾是 \r\n(CRLF),不是 Unix 风格的 \n。用 std::getline() 默认按 \n 分割,会导致读到 "GET / HTTP/1.1\r" 这种带残留 \r 的字符串,后续解析路径或方法失败。

  • 读取原始字节流后,手动查找 "\r\n" 位置比依赖 std::getline 更可靠
  • 请求行至少含三部分:methodpathversion,中间用空格分隔;空行(即连续两个 \r\n)标志着 headers 结束
  • 常见错误:把整个 recv() 缓冲区当完整请求处理——TCP 是流式协议,一次 recv() 可能只收到半行,也可能包含多个请求,必须缓存 + 状态机解析

返回响应必须严格遵循 HTTP 格式,否则浏览器直接白屏

哪怕只是返回 "Hello World",也要有状态行、Content-Length、空行和正文。少一个 \r\n,或 Content-Length 和实际字节数不符,Chrome/Firefox 就会卡在 loading 状态或显示 ERR_INVALID_HTTP_RESPONSE。

Litero
Litero

AI co-writer for students

下载
HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: 12\r\n\r\nHello World\r\n
  • Content-Length 值必须是响应体(不含 header)的字节数,不是字符串长度(注意 std::string::length() 对 UTF-8 是字节数,没问题;但若用 wstring 就错)
  • 务必以 \r\n\r\n 结束 headers,之后紧跟 body;body 后**不要**额外加 \r\n,否则算进 Content-Length 就错
  • 如果想支持 Keep-Alive,需加 Connection: keep-alive 并复用 socket,但简单场景建议每次响应后 close(client_fd),避免连接堆积

没有 TLS 就别碰 443,本地开发用 8080 或 3000 更省事

绑定 80443 端口在 Linux/macOS 需 root 权限,Windows 虽然宽松些但仍有策略限制。强行 sudo 运行 C++ 服务风险高,且和前端开发流程脱节。

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

  • 开发阶段固定用 808080003000,浏览器访问 http://localhost:8080/ 即可
  • 路径解析别硬编码 "index.html",先检查请求 path 是否为 "/",再映射到本地文件,注意防御性过滤:拒绝 "..""%2e%2e" 等目录遍历尝试
  • 真实项目不会手写 HTTP 服务器——libevent、Boost.Beast、crow、drogon 这些库已处理好边缘 case;手写只适合理解原理或嵌入式等极端受限场景
真正难的不是收发字节,是状态同步、缓冲管理、超时控制和并发安全。写完能跑通 GET 就够教学用,但上线前必须补上信号处理、日志、连接数限制和 request body 截断逻辑。

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

707

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

709

2023.11.06

html版权符号
html版权符号

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

589

2023.06.14

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

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

637

2023.06.21

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

457

2023.07.31

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

240

2023.08.01

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2847

2023.08.11

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

500

2023.08.11

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

27

2025.12.26

热门下载

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

精品课程

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

共48课时 | 6.1万人学习

Git 教程
Git 教程

共21课时 | 2.2万人学习

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

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