数据人与超自然意识 发表于 2024-10-10 17:19:59

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

前言

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

配置文件和main文件

配置文件和main文件就不讲了,直接贴代码,感兴趣的同学本身看看
#ifndef CONFIG_H
#define CONFIG_H

#include "webserver.h"

using namespace std;

class Config
{
public:
    Config();
    ~Config(){};

    void parse_arg(int argc, char*argv[]);

    //端口号
    int PORT;

    //日志写入方式
    int LOGWrite;

    //触发组合模式
    int TRIGMode;

    //listenfd触发模式
    int LISTENTrigmode;

    //connfd触发模式
    int CONNTrigmode;

    //优雅关闭链接
    int OPT_LINGER;

    //数据库连接池数量
    int sql_num;

    //线程池内的线程数量
    int thread_num;

    //是否关闭日志
    int close_log;

    //并发模型选择
    int actor_model;
};

#endif #include "config.h"

Config::Config(){
    //端口号,默认9006
    PORT = 9006;
    //PORT = 9000;

    //日志写入方式,默认同步
    LOGWrite = 0;

    //触发组合模式,默认listenfd LT + connfd LT
    TRIGMode = 0;

    //listenfd触发模式,默认LT
    LISTENTrigmode = 0;

    //connfd触发模式,默认LT
    CONNTrigmode = 0;

    //优雅关闭链接,默认不使用
    OPT_LINGER = 0;

    //数据库连接池数量,默认8
    sql_num = 8;

    //线程池内的线程数量,默认8
    thread_num = 8;

    //关闭日志,默认不关闭
    close_log = 0;

    //并发模型,默认是proactor
    actor_model = 0;
}

void Config::parse_arg(int argc, char*argv[]){
    int opt;
    const char *str = "p:l:m:o:s:t:c:a:";
    while ((opt = getopt(argc, argv, str)) != -1)
    {
      switch (opt)
      {
      case 'p':
      {
            PORT = atoi(optarg);
            break;
      }
      case 'l':
      {
            LOGWrite = atoi(optarg);
            break;
      }
      case 'm':
      {
            TRIGMode = atoi(optarg);
            break;
      }
      case 'o':
      {
            OPT_LINGER = atoi(optarg);
            break;
      }
      case 's':
      {
            sql_num = atoi(optarg);
            break;
      }
      case 't':
      {
            thread_num = atoi(optarg);
            break;
      }
      case 'c':
      {
            close_log = atoi(optarg);
            break;
      }
      case 'a':
      {
            actor_model = atoi(optarg);
            break;
      }
      default:
            break;
      }
    }
} #include "config.h"

int main(int argc, char *argv[])
{
    //需要修改的数据库信息,登录名,密码,库名
    string user = "root";
    string passwd = "123";
    string databasename = "testDB";

    //命令行解析
    Config config;
    config.parse_arg(argc, argv);

    WebServer server;

    //初始化
    server.init(config.PORT, user, passwd, databasename, config.LOGWrite,
                config.OPT_LINGER, config.TRIGMode,config.sql_num,config.thread_num,
                config.close_log, config.actor_model);
   

    //日志
    server.log_write();

    //数据库
    server.sql_pool();

    //线程池
    server.thread_pool();

    //触发模式
    server.trig_mode();

    //监听
    server.eventListen();

    //运行
    server.eventLoop();

    return 0;
} makefile

CXX ?= g++

DEBUG ?= 0
ifeq ($(DEBUG), 1)
    CXXFLAGS += -g
else
    CXXFLAGS += -O2

endif

server: main.cpp./timer/lst_timer.cpp ./http/http_conn.cpp ./log/log.cpp ./CGImysql/sql_connection_pool.cppwebserver.cpp config.cpp
        $(CXX) -o server$^ $(CXXFLAGS) -lpthread -lmysqlclient

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


https://i-blog.csdnimg.cn/blog_migrate/3cdb9171e3dc251dbd09206c94a490b2.jpeg
测试结果

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

https://i-blog.csdnimg.cn/blog_migrate/68fe226d235b86aa30522a3820d16a52.png


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

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



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: C++ Webserver从零开始:代码书写(十六)——配置文件,服务器,启动!