网站延迟加载,公司网站域名注册流程,东莞建设教育网站,网站页面设计价格点 击 关 注 上 方#xff02;两猿社#xff02;设 为#xff02;置 顶 或 星 标#xff02;#xff0c;干 货 第 一 时 间 送 达。互 联 网 猿 | 两 猿 社TineyWebServerLinux下C轻量级Web服务器#xff0c;助力初学者快速实践网络编程#xff0c;搭建属于自己的服务器… 点 击 关 注 上 方两猿社设 为置 顶 或 星 标干 货 第 一 时 间 送 达。互 联 网 猿 | 两 猿 社TineyWebServerLinux下C轻量级Web服务器助力初学者快速实践网络编程搭建属于自己的服务器.使用线程池 epoll(ET和LT均实现) 模拟Proactor模式并发模型使用状态机解析HTTP请求报文支持解析GET和POST请求通过访问服务器数据库实现web端用户注册、登录功能可以请求服务器图片和视频文件实现同步/异步日志系统记录服务器运行状态经Webbench压力测试可以实现上万的并发连接数据交换框架项目框架主要分为I/O处理单元、逻辑处理单元和存储单元三个模块I/O处理单元和逻辑处理单元对应半同步/半反应堆线程池逻辑处理单元和存储单元对应数据库连接池和日志系统半同步/半反应堆线程池将web端和服务器端建立通信实现http请求报文的处理与响应定时器完成非活动连接的处理数据库连接池避免频繁访问数据库实现登录和校验功能日志系统实现同步和异步两种方式记录服务器运行状态工作流程以一个请求到来具体的处理过程介绍项目工作流程具体包括web端和服务器建立连接访问服务器数据库完成登录和注册并通过定时器完成非活动连接的处理最后服务器运行状态通过日志系统进行记录。web端和服务器端建立连接采用epoll的边缘触发模式同时监听多个文件描述符采用同步I/O模拟proactor模式处理事件主线程负责监听客户端是否发起请求当web端发起http请求时主线程接收请求报文然后将任务插入请求队列由工作线程通过竞争从请求队列中获取任务通过http类中的主从状态机对请求报文进行分析根据请求报文对客户端进行http响应然后由主线程给客户端发送响应报文。连接数据库单例模式创建数据库连接池避免频繁建立连接用于后续web端登录和注册校验访问服务器数据库实现web端的登录和注册web访问的欢迎界面为GET请求登录和注册界面是POST请求。欢迎界面有新用户(0)和已有账号(1)两个选项若选择新用户会跳转注册(3)界面注册成功或选择已有账号跳转登录(2)界面注册或登录失败会提示失败成功和失败为01同步/异步日志系统记录服务器运行状态同步的方式下工作线程直接写入日志文件异步会另外创建一个写线程工作线程将要写的内容push进请求队列通过写线程写入文件日志文件支持按日期分类和超过最大行数自动创建新文件非活动连接的处理由于非活跃连接占用了连接资源严重影响服务器的性能通过实现一个服务器定时器处理这种非活跃连接释放连接资源。利用alarm函数周期性地触发SIGALRM信号,该信号的信号处理函数利用管道通知主循环执行定时器链表上的定时任务.Demo注册演示登录演示请求图片文件演示(6M)请求视频文件演示(39M)压力测试Webbench对服务器进行压力测试在ET非阻塞和LT阻塞模式下均可实现上万的并发连接.ET非阻塞LT阻塞并发连接总数10500访问服务器时间5s所有访问均成功注意 使用本项目的webbench进行压测时若报错显示webbench命令找不到将可执行文件webbench删除后重新编译即可。基础测试服务器测试环境Ubuntu版本16.04MySQL版本5.7.29测试前确认已安装MySQL数据库 1//建立yourdb库 2create database yourdb set utf8; 3 4//创建user表 5USE yourdb; 6CREATE TABLE user( 7 username char(50) NULL, 8 passwd char(50) NULL 9)ENGINEInnoDB;1011//添加数据12INSERT INTO user(username, passwd) VALUES(name, passwd);修改main.c中的数据库初始化信息1//root root为服务器数据库的登录名和密码2connection_pool *connPoolconnection_pool::GetInstance(localhost,root,root,yourdb,3306,5);修改http_conn.cpp中的root路径1const char* doc_root/home/qgy/TinyWebServer/root;生成server1make server启动server1./server port浏览器端1ip:port个性化测试个性化测试分为三种情况分别是校验方式、I/O复用方式、日志写入方式。校验方式选择任一校验方式代码中使用同步校验可以修改为CGI.同步线程数据库校验关闭main.c中CGISQLPOOL打开SYNSQL123 #define SYNSQL //同步数据库校验224 //#define CGISQLPOOL //CGI数据库校验关闭http_conn.cpp中两种CGI打开SYNSQL17 //同步校验28 #define SYNSQL3410 //CGI多进程使用链接池511 //#define CGISQLPOOL6713 //CGI多进程不用连接池814 //#define CGISQLCGI多进程数据库校验不使用连接池关闭main.c中SYNSQL和CGISQLPOOL123 //#define SYNSQL //同步数据库校验224 //#define CGISQLPOOL //CGI数据库校验关闭http_conn.cpp中SYNSQL和CGISQLPOOL打开CGISQL17 //同步校验28 //#define SYNSQL3410 //CGI多进程使用链接池511 //#define CGISQLPOOL6713 //CGI多进程不用连接池814 #define CGISQL关闭sign.cpp中的CGISQLPOOL打开CGISQL112 #define CGISQL //不使用连接池213 //#define CGISQLPOOL //使用连接池修改sign.cpp中的数据库初始化信息1//root root为服务器数据库的登录名和密码2connection_pool *connPoolconnection_pool::GetInstance(localhost,root,root,yourdb,3306,5);生成CGISQL.cgi1make CGISQL.cgiCGI多进程数据库校验使用连接池关闭main.c中SYNSQL打开CGISQLPOOL123 //#define SYNSQL //同步数据库校验224 #define CGISQLPOOL //CGI数据库校验关闭http_conn.cpp中SYNSQL和CGISQL打开CGISQLPOOL17 //同步校验28 //#define SYNSQL3410 //CGI多进程使用链接池511 #define CGISQLPOOL6713 //CGI多进程不用连接池814 //#define CGISQL关闭sign.cpp中的CGISQL打开CGISQLPOOL112 //#define CGISQL //不使用连接池213 #define CGISQLPOOL //使用连接池生成CGISQL.cgi1make CGISQL.cgiI/O复用方式选择任一I/O复用方式代码中使用LT阻塞可以修改为ET非阻塞.LT阻塞关闭main.c中ET打开LT128 //#define ET //边缘触发非阻塞229 #define LT //水平触发阻塞关闭http_conn.cpp中ET打开LT116 //#define ET //边缘触发非阻塞217 #define LT //水平触发阻塞ET非阻塞关闭main.c中LT打开ET128 #define ET //边缘触发非阻塞229 //#define LT //水平触发阻塞关闭http_conn.cpp中LT打开ET116 #define ET //边缘触发非阻塞217 //#define LT //水平触发阻塞日志写入方式选择任一日志方式代码中使用同步日志可以修改为异步写入.同步写入日志关闭main.c中ASYNLOG打开同步写入SYNLOG125 #define SYNLOG //同步写日志226 //#define ASYNLOG /异步写日志异步写入日志关闭main.c中SYNLOG打开异步写入ASYNLOG125 //#define SYNLOG //同步写日志226 #define ASYNLOG /异步写日志选择数据库访问、I/O复用方式或日志写入方式后按照前述生成server启动server即可进行测试.致谢Linux高性能服务器编程游双著.如果本文对你有帮助阅读原文star一下服务器项目我们需要你的星星^_^.完。