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;
}