基于C++的简单HTTP服务器实现

基于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         //水平触发阻塞
    

    测试结果

  1. LT + LT模式在这里插入图片描述
  2. LT + ET模式

    同理使用LT+ET的模式在这里插入图片描述

  3. ET+ET模式在这里插入图片描述

    日志写入方式,代码中使用同步日志,可以修改为异步写入.

同步写入日志

关闭main.c中ASYNLOG,打开同步写入SYNLOG

//#define SYNLOG //同步写日志
 #define ASYNLOG   /异步写日志

选择I/O复用方式或日志写入方式后,按照前述生成server,启动server,即可进行测试.

参考文章

https://github.com/qinguoyi/TinyWebServer/tree/raw_version
https://github.com/qinguoyi/TinyWebServer
Linux高性能服务器编程,游双著.

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现一个简单HTTP服务器,可以使用Windows平台上的C/C++编程语言。 首先,你需要了解HTTP协议的基本知识,例如请求和响应的格式、HTTP方法(GET、POST等)、状态码以及标头字段(例如Content-Type、Content-Length等)。 然后,你可以使用Winsock库来创建一个基于套接字的服务器。使用`socket`函数创建一个套接字,然后使用`bind`函数将其绑定到指定的IP地址和端口号。 接下来,你可以使用`listen`函数开始监听传入的连接请求。当有客户端发送连接请求时,你可以使用`accept`函数接受该连接,并返回一个新的套接字,用于与客户端进行通信。 在收到客户端请求后,你可以使用`recv`函数接收HTTP请求。解析请求的首部和URI路径,并根据请求确定要执行的操作。 对于GET请求,你可以打开请求的文件,并将文件内容作为HTTP响应返回给客户端。你可以使用`fopen`函数打开文件,然后使用`fread`函数读取文件内容,并使用`send`函数发送响应到客户端。 对于POST请求,你可以解析请求体中的数据,并根据需求执行相应的操作。例如,你可以解析表单数据、存储到数据库或者进行其他处理。 最后,你可以使用`closesocket`函数关闭套接字,并释放相关资源。 需要注意的是,这只是一个简单HTTP服务器实现示例,如果你想要一个更完整和稳定的服务器,你可能需要处理并发连接、多线程或者使用更成熟的HTTP服务器框架。 总结起来,实现一个简单的Windows平台上的C/C++ HTTP服务器涉及到使用Winsock库创建套接字、接受连接请求、解析HTTP请求、处理请求并发送响应等步骤。希望这个回答对你有所帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值