项目描述:
通过 HTTP 协议与客户端(通常是浏览器(Browser))进行通信,来接收、存储、处理来自客户端的 HTTP 请求,并对其请求做出 HTTP 响应,返回给客户端其请求的内容(文件、页等)或返回一个 Error 信息
项目环境:
Centos7 + Visual Studio Code + gcc
项目步骤:
1.规划整个项目的架构及流程
架构 :线程池+非阻塞socket+epoll+事件处理的并发模型 、 状态机解析HTTP请求
同步 I/O 模拟 Proactor 模式的工作流程:
2.线程同步机制类封装及线程池实现
同步机制类封装(临界区) :
互斥锁类 条件变量类 信号量类
线程池实现:
成员变量:线程池线程数量、线程池数组、最大请求量、请求队列、请求队列锁、请求队列信号量、是否结束线程
成员函数:构造函数、析构函数、追加函数
3.项目整体流程代码实现
1.接收端口(在接收端口之前要一个判断是否有输入端口)
2.处理SIGPIPE信号
3.创建线程池
4.创建http_conn用户组users
5.创建监听的socket(端口记得设置为端口复用)
6.创建epoll,用来 管理服务器监听端和客户端的socket描述符
7.while循环,处理数据
4.解析HTTP请求报文
请求报文格式:
1.把缓冲区内容一行行解析出来,判断依据\r\n
2.解析HTTP请求行,获得请求方法,目标URL,以及HTTP版本号
3.解析HTTP请求的头部信息
4.判断消息体(即请求数据)是否被完整读入
5.主状态机解析请求
5.解析请求完成及生成响应信息
当得到一个完整、正确的HTTP请求时,通过内存映射的方式获取文件
响应报文格式:
生成响应文件的思想跟解析请求文件是差不多的:生成状态行、响应头、响应体(即响应正文)
标签:web,HTTP,请求,端口,c++,响应,线程,解析,轻量级 From: https://www.cnblogs.com/balabalabubalabala/p/17013210.html