动态

王宇松/webserver

介绍 Introduction

  • 基于C++编写的服务器,支持解析get请求,处理静态资源;
  • 使用非阻塞的EPOLL边沿触发(ET模式)实现IO多路复用;
  • 使用线程池提高并发度,降低频繁创建、销毁线程的开销;
  • 使用有限状态机解析http请求;
  • 支持日志系统,记录服务器运行情况及资源访问情况;
  • 支持定时器,定时执行相应回调函数;
  • usage: ./WebServer port
  • 默认网站根目录(src/http_conn.cpp: line-37):/var/www

开发环境 Environment

操作系统:Ubuntu 20.04.2 LTS
编译器:g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
自动化构建:cmake (version 3.16.3)

文件目录结构 File Tree

.
├── build                       #构建目录
│   └── readme.md               #编译命令说明
├── CMakeLists.txt              #cmake
├── include                     #头文件目录   
│   ├── http_conn.h             #http逻辑处理 头文件
│   ├── http_content_type.h     #记录http content-type文件类型
│   ├── locker.h                #封装线程同步机制
│   ├── log.h                   #日志系统 头文件
│   ├── threadpool.h            #线程池
│   └── timer.h                 #定时器 时间堆(小顶堆) 头文件
├── LICENSE
├── README.md                   #项目说明文档
└── src                         #源文件目录
    ├── http_conn.cpp           #http逻辑处理
    ├── log.cpp                 #日志系统
    ├── main.cpp                #主函数
    └── timer.cpp               #时间堆(小顶堆)

3 directories, 14 files

编译、运行 Compile & Run

cd build
cmake ..
make

./WebServer 8989

运行截图 Screenshots

编译

编译.png

运行 - 服务器

run_server.png

运行 - 浏览器

run_browser.png

运行 - 文件内容包含中文

文件内容包含中文.png

运行 - 链接包含中文字符

中文链接.png

运行 - 响应头

响应头.png

日志文件

日志.png

版本历史 History

版本历史
2021-08-18

v0.5.0
新增:定时器模块,定时发出信号,由独立的线程调用相应的回调函数;
优化:降低LOG::get_time()函数的执行频率,由定时器控制每60秒执行一次;
优化:去除独立的日志线程,改由定时器定时将日志数据写入文件;
优化:大幅降低使用write系统调用的次数,提升运行效率;
优化:代码及部分注释清理、优化;

2021-08-15

v0.3.3
优化:自动获取服务器ip地址,无需在运行时手动输入;

2021-08-13

v0.3.0
新增:日志系统,记录服务器运行情况及资源访问情况;
新增:ip地址及端口号合法性校验;

2021-08-12

v0.2.0
新增:支持访问文件名为中文的文件(中文链接);
新增:添加更多响应头部字段 -> Content-Type(默认text/plain)、Date(GMT);
修复:修复文件内容为中文时的乱码问题(未指定字符集);
优化:代码清理;

2021-08-11

v0.1.0
初始版本:《Linux高性能服务器编程》示例代码

开发计划 Todo List

Todo List

v1.0.0版本开发中…… :

40%

建议 & 反馈 Suggestions & Issues



更新于2021.08.18

最后修改:2021 年 08 月 18 日 10 : 25 PM