TinyWebServer2--config和main代码部分

文章介绍了config.h和config.cpp文件在配置服务器参数中的作用,特别是关于EPOLL的ET(边沿触发)和LT(水平触发)模式的设定,以及如何通过命令行参数解析来调整这些模式。此外,还提到了并发模型的选择(reactor和proactor),线程池和数据库连接池的配置。
摘要由CSDN通过智能技术生成

config.h函数

此处是模式切换

在Listenfd和cfd都建立ET和LT两种模式,即四种组合方式

ET和LT是epoll的两种模式

ET:边沿触发,只有数据到来才触发

LT:水平触发,只要有数据都会触发

#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;//触发组合模式
    int LISTENTrigmode;//listenfd触发模式
    int CONNTrigmode;//connfd触发模式
    int OPT_LINGER;//优雅关闭链接
    int sql_num;//数据库连接池数量
    int thread_num;//线程池内的线程数量
    int close_log;//是否关闭日志
    int actor_model;//并发模型选择
};

#endif

config.cpp函数

在构造函数里作出对各种初始模式的设定

并发模式的处理,给出了reactor和proactor两种方式

TRIGMode默认为最低效模式,可以改为1,实现服务器的最高性能,大概实现10wQPS

其中利用getopt函数解析命令行参数

C语言中getopt()函数的用法[通俗易懂]-腾讯云开发者社区-腾讯云 (tencent.com)

C/C++ 命令解析:getopt 方法详解和使用示例_阿飞__的博客-CSDN博客

atoi():输入为optarg,其是string类型,转换为int类型

#include "config.h"
Config::Config(){
    PORT = 9006;//端口号,默认9006
    LOGWrite = 0;//日志写入方式,默认同步
    TRIGMode = 0;//触发组合模式,默认listenfd LT + connfd LT
    LISTENTrigmode = 0;//listenfd触发模式,默认LT
    CONNTrigmode = 0;//connfd触发模式,默认LT
    OPT_LINGER = 0;//优雅关闭链接,默认不使用
    sql_num = 8;//数据库连接池数量,默认8
    thread_num = 8;//线程池内的线程数量,默认8
    close_log = 0;//关闭日志,默认不关闭
    actor_model = 0;//并发模型,默认是proactor
}

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)//利用getopt解析命令参数
    {
        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;
        }
    }
}

main.cpp函数

WebServer被单独作为一个类实现,并且封装好了调度函数

main模块的主要功能是,驱动Sever以及数据库

各种信息来自于config

1、数据库信息

2、命令行解析(给数据库的运行方式传参)

3、初始化一个服务器对象server

4、调度server的各个函数
首先打开线程池,然后设置运行模式,之后就是启动监听和进入工作循环(永久循环)

#include "config.h"

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

    //命令行解析
    //这里的命令行解析是给数据库的运行方式传参,当然也可以什么都不传。
    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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值