Skip to content

Zhenghao-Liu/MiniWebServer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 

Repository files navigation

MiniWebServer

Linux下C++轻量级Web服务器,助力初学者快速实践网络编程,搭建属于自己的服务器.

  • 测试页
  • 使用 线程池 + 非阻塞socket + epoll(ET和LT均实现) + 事件处理(Reactor和模拟Proactor均实现) 的并发模型
  • 使用状态机解析HTTP请求报文,支持解析GET和POST请求
  • 访问服务器数据库实现web端用户注册、登录功能,可以请求服务器图片和视频文件
  • 实现同步/异步日志系统,记录服务器运行状态
  • 经Webbench压力测试可以实现上万的并发连接数据交换

框架

frame

Code目录树

.
|-- build.sh
|-- CGImysql
|   |-- README.md
|   |-- sql_connection_pool.cpp
|   `-- sql_connection_pool.h
|-- config.cpp
|-- config.h
|-- http
|   |-- http_conn.cpp
|   |-- http_conn.h
|   `-- README.md
|-- lock
|   |-- locker.h
|   `-- README.md
|-- log
|   |-- block_queue.h
|   |-- log.cpp
|   |-- log.h
|   `-- README.md
|-- main.cpp
|-- makefile
|-- root
|   |-- fans.html
|   |-- favicon.ico
|   |-- judge.html
|   |-- logError.html
|   |-- log.html
|   |-- picture.html
|   |-- README.md
|   |-- registerError.html
|   |-- register.html
|   |-- test1.jpg
|   |-- video.html
|   |-- welcome.html
|   |-- xxx.jpg
|   `-- xxx.mp4
|-- server
|-- show_errno
|   |-- README.md
|   `-- show_errno.h
|-- test_presure
|   |-- README.md
|   `-- webbench-1.5
|       |-- ChangeLog
|       |-- COPYRIGHT
|       |-- debian
|       |   |-- changelog
|       |   |-- control
|       |   |-- copyright
|       |   |-- dirs
|       |   `-- rules
|       |-- Makefile
|       |-- socket.c
|       |-- tags
|       |-- webbench
|       |-- webbench.1
|       |-- webbench.c
|       `-- webbench.o
|-- threadpool
|   |-- half-sync-reactive.bmp
|   |-- README.md
|   `-- threadpool.h
|-- timer
|   |-- lst_timer.cpp
|   |-- lst_timer.h
|   `-- README.md
|-- webserver.cpp
`-- webserver.h

运行

  • 系统环境

    • Centos 7
    • MYSQL 8.0.22
    • 以上是作者运行的环境,可自行调整
  • 浏览器环境

    • Chrome
  • 测试前确保已经安装好MYSQL

// 建立yourdb库
// 这里的yourdb是自定义名字,是后面main中的databasename
CREATE DATABASE yourdb;
USE yourdb;

// 创建user表,表名不更改
CREATE TABLE user(
    username char(50) NULL,
    passwd char(50) NULL
)ENGINE=InnoDB;

// 添加数据,这里作为测试表是否可用,其实也是等于创建了一个用户
INSERT INTO user(username, passwd) VALUES('name', 'passwd');
  • 修改main.cpp中的数据库初始化信息
//MYSQL登录名,密码,DATABASE数据库名
string user = "root";
string passwd = "root";
string databasename = "yourdb";
  • 编译
# 方式1
$ sh ./build.sh
# 方式2
$ make server
  • 运行主程序
$ ./server
  • 也可个性化配置参数运行主程序
$ ./server [-p port] [-l LOGWrite] [-m TRIGMode] [-o OPT_LINGER] [-s sql_num] [-t thread_num] [-c close_log] [-a actor_model]

温馨提示:以上参数不是非必须,不用全部使用,根据个人情况搭配选用即可.

  • -p,自定义端口号
    • 默认9006
  • -l,选择日志写入方式,默认同步写入
    • 0,同步写入
    • 1,异步写入
  • -m,listenfd和connfd的模式组合,默认使用LT + LT
    • 0,表示使用LT + LT
    • 1,表示使用LT + ET
    • 2,表示使用ET + LT
    • 3,表示使用ET + ET
  • -o,优雅关闭连接,默认不使用
    • 0,不使用
    • 1,使用
  • -s,数据库连接数量
    • 默认为8
  • -t,线程数量
    • 默认为8
  • -c,关闭日志,默认打开
    • 0,打开日志
    • 1,关闭日志
  • -a,选择反应堆模型,默认Proactor
    • 0,Proactor模型
    • 1,Reactor模型

浏览器运行结果查看

  1. 方式1:以个人主机ip和端口的方式
主机ip:端口
http://175.24.234.48:9006/
  1. 方式2:在本机上运行则可直接输入端口
端口号
localhost:9006

压力测试

一些遇到的问题

学习自

  1. 《Linux高性能服务器编程》游双
  2. TinyWebServer 已经提交Pull request请求merge
  3. 文章

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published