C++ Webserver从零开始:代码书写(十六)——配置文件,服务器,启动! ...

打印 上一主题 下一主题

主题 903|帖子 903|积分 2709

前言

   现在是2024年2月28日的晚上20点36分,我完成了博客的所有内容。现在我整个人有一种如释重负的感觉,本日用webbench测试的时间还闹了个笑话,我在使用测试命令时,url多写了一个http://没注意,导致webbench访问服务器不绝被拒,我一度以为是我代码有题目。还跑到群里,社区里求助,也给我一个同学发了过去。网上也搜索了好久,甚至我还跑去看webbench的源码。但是显而易看法一无所获。就在我心灰易冷地时间,我发现了我给我同学发的出错照片里面的webbecn调用返回信息有两个http://,但哪怕是如许我也没反应过来是我的url写错了,我还问他有没有什么头绪,是不是webbench的url解析代码有题目?厥后等我发现是我打错了的时间,再看谈天记录发现他以及说了答案“重复了”,搞得我哭笑不得。好在发现了题目所在,webbench正常使用,让本专栏得以完结(差点烂尾)
  
配置文件和main文件

配置文件和main文件就不讲了,直接贴代码,感兴趣的同学本身看看
  1. #ifndef CONFIG_H
  2. #define CONFIG_H
  3. #include "webserver.h"
  4. using namespace std;
  5. class Config
  6. {
  7. public:
  8.     Config();
  9.     ~Config(){};
  10.     void parse_arg(int argc, char*argv[]);
  11.     //端口号
  12.     int PORT;
  13.     //日志写入方式
  14.     int LOGWrite;
  15.     //触发组合模式
  16.     int TRIGMode;
  17.     //listenfd触发模式
  18.     int LISTENTrigmode;
  19.     //connfd触发模式
  20.     int CONNTrigmode;
  21.     //优雅关闭链接
  22.     int OPT_LINGER;
  23.     //数据库连接池数量
  24.     int sql_num;
  25.     //线程池内的线程数量
  26.     int thread_num;
  27.     //是否关闭日志
  28.     int close_log;
  29.     //并发模型选择
  30.     int actor_model;
  31. };
  32. #endif
复制代码
  1. #include "config.h"
  2. Config::Config(){
  3.     //端口号,默认9006
  4.     PORT = 9006;
  5.     //PORT = 9000;
  6.     //日志写入方式,默认同步
  7.     LOGWrite = 0;
  8.     //触发组合模式,默认listenfd LT + connfd LT
  9.     TRIGMode = 0;
  10.     //listenfd触发模式,默认LT
  11.     LISTENTrigmode = 0;
  12.     //connfd触发模式,默认LT
  13.     CONNTrigmode = 0;
  14.     //优雅关闭链接,默认不使用
  15.     OPT_LINGER = 0;
  16.     //数据库连接池数量,默认8
  17.     sql_num = 8;
  18.     //线程池内的线程数量,默认8
  19.     thread_num = 8;
  20.     //关闭日志,默认不关闭
  21.     close_log = 0;
  22.     //并发模型,默认是proactor
  23.     actor_model = 0;
  24. }
  25. void Config::parse_arg(int argc, char*argv[]){
  26.     int opt;
  27.     const char *str = "p:l:m:o:s:t:c:a:";
  28.     while ((opt = getopt(argc, argv, str)) != -1)
  29.     {
  30.         switch (opt)
  31.         {
  32.         case 'p':
  33.         {
  34.             PORT = atoi(optarg);
  35.             break;
  36.         }
  37.         case 'l':
  38.         {
  39.             LOGWrite = atoi(optarg);
  40.             break;
  41.         }
  42.         case 'm':
  43.         {
  44.             TRIGMode = atoi(optarg);
  45.             break;
  46.         }
  47.         case 'o':
  48.         {
  49.             OPT_LINGER = atoi(optarg);
  50.             break;
  51.         }
  52.         case 's':
  53.         {
  54.             sql_num = atoi(optarg);
  55.             break;
  56.         }
  57.         case 't':
  58.         {
  59.             thread_num = atoi(optarg);
  60.             break;
  61.         }
  62.         case 'c':
  63.         {
  64.             close_log = atoi(optarg);
  65.             break;
  66.         }
  67.         case 'a':
  68.         {
  69.             actor_model = atoi(optarg);
  70.             break;
  71.         }
  72.         default:
  73.             break;
  74.         }
  75.     }
  76. }
复制代码
  1. #include "config.h"
  2. int main(int argc, char *argv[])
  3. {
  4.     //需要修改的数据库信息,登录名,密码,库名
  5.     string user = "root";
  6.     string passwd = "123";
  7.     string databasename = "testDB";
  8.     //命令行解析
  9.     Config config;
  10.     config.parse_arg(argc, argv);
  11.     WebServer server;
  12.     //初始化
  13.     server.init(config.PORT, user, passwd, databasename, config.LOGWrite,
  14.                 config.OPT_LINGER, config.TRIGMode,  config.sql_num,  config.thread_num,
  15.                 config.close_log, config.actor_model);
  16.    
  17.     //日志
  18.     server.log_write();
  19.     //数据库
  20.     server.sql_pool();
  21.     //线程池
  22.     server.thread_pool();
  23.     //触发模式
  24.     server.trig_mode();
  25.     //监听
  26.     server.eventListen();
  27.     //运行
  28.     server.eventLoop();
  29.     return 0;
  30. }
复制代码
makefile

  1. CXX ?= g++
  2. DEBUG ?= 0
  3. ifeq ($(DEBUG), 1)
  4.     CXXFLAGS += -g
  5. else
  6.     CXXFLAGS += -O2
  7. endif
  8. server: main.cpp  ./timer/lst_timer.cpp ./http/http_conn.cpp ./log/log.cpp ./CGImysql/sql_connection_pool.cpp  webserver.cpp config.cpp
  9.         $(CXX) -o server  $^ $(CXXFLAGS) -lpthread -lmysqlclient
  10. clean:
  11.         rm  -r server
复制代码

运行

创建数据库
将上述文件全部生存到根目次后,运行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模子



压力测试

webbench原理

webbench是一个开源的用来测试服务器性能的小软件,其基本原理是创建多个子历程举行服务器访问,子历程将本身得到的数据通过管道发给主历程,主历程将结果统计打印输出在屏幕上



测试结果

压力测试使用的webbench-1.5版本,因为我的云服务器是2核2G,webbench本身也会创建非常多历程,以是并发量只能达到4800,换一个硬件情况应该能达到更高的数据。





可以看到,在跑webbench的时间,我的服务器的内存最高差不多跑到了1800多,基本上是给内存全部跑慢了,对于一个2G的内存来说,这已经是接近极限的数字。而系统盘IO达到了差不多40000KB/s,从这个角度上来看,我的服务器应该没有什么大的性能瓶颈了。
竣事语

这个专栏到这里就竣事了,完成了所有的东西我还是非常开心的,背面找些时间把github上的README整理一下,我的webserver之旅就彻底完结。

润了~~o(* ̄▽ ̄*)ブ



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

数据人与超自然意识

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表