当前位置:   article > 正文

linux c++服务器,GitHub - Sanzo00/TinyWebServer: Linux下C++轻量级Web服务器

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

TinyWebServer

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

使用 线程池 + 非阻塞socket + epoll(ET和LT均实现) + 事件处理(Reactor和Proactor均实现) 的并发模型

使用状态机解析HTTP请求报文,支持解析GET和POST请求

访问服务器数据库实现web端用户注册、登录功能,可以请求服务器图片和视频文件

实现同步/异步日志系统,记录服务器运行状态

经Webbench压力测试可以实现上万的并发连接数据交换

目录

概述

框架

10eca0173cea36dcbf540296cb97cacb.png

Demo演示

注册演示

06dd3d701805c653460b7b415baefd94.gif

登录演示

ad8750a03b3e496db29bd7ddf829d186.gif

请求图片文件演示(6M)

687474703a2f2f7777312e73696e61696d672e636e2f6c617267652f303035544a3263376c79316765306a7578726e6c66673330676f3037783471722e676966

请求视频文件演示(39M)

687474703a2f2f7777312e73696e61696d672e636e2f6c617267652f303035544a3263376c79316765306a74786965386e673330676f3037786232622e676966

压力测试

在关闭日志后,使用Webbench对服务器进行压力测试,在ET和LT模式下均可实现上万的并发连接.

Proactor,LT,84016 QPS

0cbb10a0e5bdf726224987f96d29cc4c.png

Proactor,ET,83419 QPS

8280aea08b03ce9be9c7887b7de41a16.png

Reactor,LT,60218 QPS

e34302936816b8aa8c6711f42d6f2e3b.png

Reactor,ET,58138 QPS

24b12b044d6a7f202b9af86c824db44f.png

并发连接总数:10500

访问服务器时间:5s

所有访问均成功

注意: 使用本项目的webbench进行压测时,若报错显示webbench命令找不到,将可执行文件webbench删除后,重新编译即可。

更新日志

解决请求服务器上大文件的Bug

增加请求视频文件的页面

解决数据库同步校验内存泄漏

实现两种CGI数据库访问逻辑

实现非阻塞模式下的ET和LT触发,并完成压力测试

完善lock.h中的封装类,统一使用该同步机制

改进代码结构,更新局部变量懒汉单例模式

优化数据库连接池信号量与代码结构

使用RAII机制优化数据库连接的获取与释放

优化代码结构,封装工具类以减少全局变量

编译一次即可,命令行进行个性化测试更加友好

main函数封装重构

新增命令行日志开关,关闭日志后更新压力测试结果

改进编译方式,只配置一次SQL信息即可

新增Reactor模式,并完成压力测试

源码下载

目前有两个版本,版本间的代码结构有较大改动,文档和代码运行方法也不一致。重构版本更简洁,原始版本(raw_version)更大保留游双代码的原汁原味,从原始版本更容易入手.

如果遇到github代码下载失败,或访问太慢,可以从以下链接下载,与Github最新提交同步.

重构版本下载地址 : BaiduYun

提取码 : a7db

原始版本(raw_version)下载地址 : BaiduYun

提取码 : gpq2

原始版本运行请参考原始文档

快速运行

服务器测试环境

Ubuntu版本16.04

MySQL版本5.7.29

浏览器测试环境

Windows、Linux均可

Chrome

FireFox

其他浏览器暂无测试

测试前确认已安装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.cpp中的数据库初始化信息

//数据库登录名,密码,库名

string user = "root";

string passwd = "root";

string databasename = "yourdb";

build

sh ./build.sh

启动server

./server

浏览器端

ip:9006

个性化运行

./server [-p port] [-v SQLVerify] [-l LOGWrite] [-m TRIGMode] [-o OPT_LINGER] [-s sql_num] [-t thread_num] [-c close_log] [-a actor_model]

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

-p,自定义端口号

默认9006

-v,选择数据库校验方式,默认同步校验

0,同步校验,使用连接池

1,CGI校验,使用连接池

2,CGI校验,不使用连接池

-l,选择日志写入方式,默认同步写入

0,同步写入

1,异步写入

-m,epoll的触发模式,默认使用LT

0,表示使用LT

1,表示使用ET

-o,优雅关闭连接,默认不使用

0,不使用

1,使用

-s,数据库连接数量

默认为8

-t,线程数量

默认为8

-c,关闭日志,默认打开

0,打开日志

1,关闭日志

-a,选择反应堆模型,默认Proactor

0,Proactor模型

1,Reactor模型

测试示例命令与含义

./server -p 9007 -v 1 -l 1 -m 0 -o 1 -s 10 -t 10 -c 1 -a 1

端口9007

CGI校验,使用连接池

异步写入日志

使用LT水平触发

使用优雅关闭连接

数据库连接池内有10条连接

线程池内有10条线程

关闭日志

Reactor反应堆模型

庖丁解牛

近期版本迭代较快,以下内容多以旧版本(raw_version)代码为蓝本进行详解,重构版本讲解将于下月重制发布,感谢理解.

致谢

Linux高性能服务器编程,游双著.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/976454
推荐阅读
相关标签
  

闽ICP备14008679号