C++实现HTTP服务器项目记录汇总

一、项目简介

- 项目使用线程池 + 阻塞/非阻塞SOCKET+ EPOLL(ET和LT均实现)+ 事件处理模式(Reactor与同步I/O模拟的Proactor均实现)。
- 访问服务器数据库实现WEB端用户注册、登录功能,可以请求服务器图片和视频资源。

二、项目模块

一、日志系统
(1)懒汉式单例模式创建日志系统。
(2)实现按天分类,超行分文件功能。
(3)日志分四级

  • Debug:调试代码时使用。
  • Warn:调试代码时使用。
  • Info:报告系统当前的状态。
  • Error:输出系统的错误信息。

(5)实现同步/异步写入方式。

  • 同步写入方式:利用互斥锁实现工作线程互斥地访问日志文件,并写入日志内容。
  • 异步写入方式:将其抽象为生产者-消费者模型,将工作线程产生的日志内容存入缓冲区,写日志线程从缓冲区中取出内容,写入日志。缓冲区是循环数组实现的队列,利用互斥锁实现线程互斥地访问缓冲区,利用条件变量实现“生产”与“消费”之间的同步。同时利用互斥锁实现写线程互斥地访问日志文件,并写入日志内容。

二、数据库连接池
(1)懒汉式单例模式创建数据库连接池。
(2)链表实现数据库连接池。
(3)数据库连接的获取与释放通过RAII机制封装,避免手动释放。
(4)利用互斥锁实现工作线程互斥地访问数据库连接池,利用信号量实现“获取”与“释放”之间的同步,信号量初始化为最大连接数。

三、HTTP
(1)使用状态机解析HTTP请求报文,从状态机负责读取报文的一行,主状态机负责对该行数据进行解析。
(2)仅支持HTTP1.1,支持解析GET和POST请求。

四、定时器处理非活动连接
(1)统一事件源。捕捉定时器信号与程序结束信号,信号处理函数往管道的写端写入信号值,主循环使用I/O复用系统调用监听管道读端的可读事件与其他文件描述符,从而实现统一处理。设置超时时间15s,如果检测到超时信号,就删除非活动连接在EPOLL上的注册事件、关闭文件描述符等,释放完连接资源后,重新开始定时。如果文件描述符发生了数据的交换,调整该定时器的位置,定时器重新计时。
(2)带头尾结点的升序双向链表管理定时器。

五、线程池
(1)链表实现任务队列。
(2)利用互斥锁实现工作线程互斥地访问任务队列(存放HTTP连接),利用信号量实现“生产”与“消费”之间的同步,信号量初始化为0。
(3)子线程做线程分离,不需要主线程阻塞地回收资源。

三、项目框架

在这里插入图片描述

四、压力测试

1 vCPU  2 GiB (I/O优化)  ecs.n4.small  1Mbps

1. Reactor + LT + ET

并发连接总数为100,访问服务器时间为5s,所有访问均成功。

Reactor + LT + ET

2. Proeactor + LT + ET

并发连接总数为100,访问服务器时间为5s,所有访问均成功。

Proeactor + LT + ET

五、各模块记录

【C++实现HTTP服务器项目记录】日志系统
【C++实现HTTP服务器项目记录】数据库连接池
【C++实现HTTP服务器项目记录】线程同步类
【C++实现HTTP服务器项目记录】线程池
【C++实现HTTP服务器项目记录】定时器处理非活动连接
【C++实现HTTP服务器项目记录】HTTP报文处理
【C++实现HTTP服务器项目记录】服务器

参考: https://github.com/qinguoyi/TinyWebServer

  • 17
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值