title | date | description | author |
---|---|---|---|
手动用cpp实现http(零) |
2020-07-30 |
dashjay |
2020年7月,笔者经过学习了cpp后打算入坑尝试手动实现 HTTP 服务器,过程中遇到很多问题,本文记录了笔者留下的一些记录,提供参考。
下面的叙述中含有一些脚注,为了不影响已经非常熟悉的同学的阅读,我把一些说明放到了脚注里,方便阅读。
Repo我开在这里,欢迎大家点个Star或者Fork操作。https://github.com/dashjay/http_demo.git
本教程[1],使用6节课程/文章,尝试使用最简单的CPP知识实现一个高性能,简单的的HTTP Server,课程使用 bazel 进行构建,简化了构建流程。
- [易]简单的 bazel 的教程,选用一个Socket库[2]并实现一个echo[3]。link
- [易]定义HTTP请求和返回体的结构,构建并输出HTTP请求和返回体到标准输出。link
- [易]引入cpptoml从文件读取配置,引入spdlog尝试打log,帮助调试。link
- [难]定义一个bufReader类,并且使用该bufReader从TCP流中解析HTTP请求和返回体。link
- [易]实现主程序逻辑,监听端口,接收请求。link
- [选]实现其他HTTP附加功能。
- 2020-08-06:维护 4 个分支太麻烦了,所有教程全部放到 master 分支的不同文件夹下
- 2020-08-05:更新教程 4-bufreader
- 2021-11-01:最近学习了 bazel 的使用,于是将项目 bazel 化
- 一个顺手的IDE,推荐CLion,VScode,也可以用VIM,Emacs或你顺手的。
- 建议使用在Linux或MacOS下进行,因为我本地没Windows,没法为大家验证过程可行性。
- 你的耐心
解释
- 算不上什么教程,顺便测试一下脚注。
- HTTP/GRPC 等等这样的协议通常底层采用TCP来实现,也就是学校里学到的那种面向流的服务,cpp中的系统调用实现的socker接口用起来有些不顺手。因此我找到了一个现代的Socket库https://github.com/fpagliughi/sockpp来帮助我们在这节课中完成HTTP服务器。
- 你发给它什么,他就回复什么,常见的网络库都会用这个代替HELLOWORLD
- bazel 是一个构建工具,可以帮助项目进行构建,类似一个 Cmake ,文档在这里 bazel c++,比如第一个程序可以通过命令
bazel run //1-cmake-socket-echo:hello-world
来构建并且运行。