概述
基于C++的简单HTTP服务器实现
一个Web Server就是一个服务器软件(程序),或者是运行这个服务器软件的硬件(计算机)。其主要功能是通过HTTP协议与客户端(通常是浏览器(Browser))进行通信,来接收,存储,处理来自客户端的HTTP请求,并对其请求做出HTTP响应,返回给客户端其请求的内容(文件、网页等)或返回一个Error信息。
总体概述
- 使用线程池 + epoll(ET和LT均实现) + 模拟Proactor模式的并发模型;
- 使用状态机解析HTTP请求报文,支持解析GET和POST请求;
- 改进成小根堆实现的定时器,关闭超时的非活动连接;
- 利用RAII机制实现了数据库连接池,减少数据库连接建立与关闭的开销,同时实现了用户注册登录功能;
- 实现同步/异步日志系统,记录服务器运行状态;
- 改进了http_conn::write()函数,可以传输大文件;
- 经Webbench压力测试可以实现上万的并发连接数据交换。
具体实现
服务器测试环境
- Ubuntu版本16.04
- MySQL版本5.7.29
- 火狐浏览器测试环境
测试前确认已安装MySQL数据库
// 建立yourdb库
create database yourdb;
// 创建user表
USE yourdb;
CREATE TABLE user(
username char(50) NULL,
passwd char(50) NULL
)ENGINE=InnoDB;
// 添加数据
INSERT INTO user(username, passwd) VALUES('name', 'passwd');
修改main.c中的数据库初始化信息
// root root修改为服务器数据库的登录名和密码
// yourdb修改为上述创建的yourdb库名
// 3306是默认端口号
connPool->init("localhost", "root", "root", "yourdb", 3306, 8);
修改http_conn.cpp中的root路径
// 修改为root文件夹所在路径
const char *doc_root = "/home/ubuntu16/WEb/1/root";
在终端打开,生成server,启动编译
make server
启动server,port为端口号,可以指定一个如9006,12345
./server port
打开火狐浏览器
http://localhost:9006/ 或者 127.0.0.1:9006
代码运行
项目并发测试
测试方法
- 测试环境: Ubuntu:16.04 cpu:i7-9700 内存:16G。在四种并发模式下系统运行状态
./test_presure/webbench-1.5/webbench -c 100 -t 10 http://ip:port/
./test_presure/webbench-1.5/webbench -c 1000 -t 10 http://ip:port/
./test_presure/webbench-1.5/webbench -c 5000 -t 10 http://ip:port/
./test_presure/webbench-1.5/webbench -c 10000 -t 10 http://ip:port/
I/O复用方式,listenfd和connfd可以使用不同的触发模式,代码中使用LT + LT模式,可以自由修改与搭配.
- listenfd触发模式,关闭main.c中listenfdET,打开listenfdLT
//#define listenfdET //边缘触发非阻塞
#define listenfdLT //水平触发阻塞
- listenfd触发模式,关闭http_conn.cpp中listenfdET,打开listenfdLT
//#define listenfdET //边缘触发非阻塞
#define listenfdLT //水平触发阻塞
connfd触发模式,关闭http_conn.cpp中connfdET,打开connfdLT
//#define connfdET //边缘触发非阻塞
#define connfdLT //水平触发阻塞
测试结果
-
LT + LT模式
-
LT + ET模式
同理使用LT+ET的模式
-
ET+ET模式
日志写入方式,代码中使用同步日志,可以修改为异步写入.
- 同步写入日志
关闭main.c中ASYNLOG,打开同步写入SYNLOG
#define SYNLOG //同步写日志
//#define ASYNLOG /异步写日志
- 异步写入日志
关闭main.c中SYNLOG,打开异步写入ASYNLOG
//#define SYNLOG //同步写日志
#define ASYNLOG /异步写日志
选择I/O复用方式或日志写入方式后,按照前述生成server,启动server,即可进行测试.
参考文章
https://github.com/qinguoyi/TinyWebServer/tree/raw_version
https://github.com/qinguoyi/TinyWebServer
Linux高性能服务器编程,游双著.
最后
以上就是碧蓝寒风为你收集整理的基于C++的简单HTTP服务器实现基于C++的简单HTTP服务器实现的全部内容,希望文章能够帮你解决基于C++的简单HTTP服务器实现基于C++的简单HTTP服务器实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复