为了避免在源程序中频繁设置某些变量(线程数量,客户端数量)的值,我们把这些变量设置为参数,通过设置命令行脚本的值,修改这些参数
EasyTcpClient.bat
@echo off
::::::::::::::::::
::key-val
::字典
::std::map<k,v>
::QQ:282274770
::::::::::::::::::
::服务端IP地址
set cmd="strIP=127.0.0.1"
::服务端端口
set cmd=%cmd% nPort=4567
::工作线程数量
set cmd=%cmd% nThread=1
::每个工作线程,创建多少个客户端
set cmd=%cmd% nClient=10000
::::::数据会先写入发送缓冲区
::::::等待socket可写时才实际发送
::每个客户端在nSendSleep(毫秒)时间内
::最大可写入nMsg条Login消息
::每条消息100字节(Login)
set cmd=%cmd% nMsg=10
set cmd=%cmd% nSendSleep=1000
::客户端发送缓冲区大小(字节)
set cmd=%cmd% nSendBuffSize=20480
::客户端接收缓冲区大小(字节)
set cmd=%cmd% nRecvBuffSize=20480
::检查接收到的服务端消息ID是否连续
set cmd=%cmd% -checkMsgID
::::::
::::::
::启动程序 传入参数
EasyTcpClient %cmd%
pause
EasyTcpServer.bat
@echo off
::::::::::::::::::
::key-val
::字典
::std::map<k,v>
::QQ:282274770
::::::::::::::::::
::服务端IP地址
set cmd="strIP=any"
::服务端端口
set cmd=%cmd% nPort=4567
::消息处理线程数量
set cmd=%cmd% nThread=1
::客户端连接上限
set cmd=%cmd% nMaxClient=10000
::客户端发送缓冲区大小(字节)
set cmd=%cmd% nSendBuffSize=20480
::客户端接收缓冲区大小(字节)
set cmd=%cmd% nRecvBuffSize=20480
::收到消息后将返回应答消息
set cmd=%cmd% -sendback
::提示发送缓冲区已写满
::当出现sendfull提示时,表示当次消息被丢弃
set cmd=%cmd% -sendfull
::检查接收到的客户端消息ID是否连续
set cmd=%cmd% -checkMsgID
::自定义标志 未使用
set cmd=%cmd% -p
::启动程序 传入参数
EasyTcpServer %cmd%
pause
对应这些脚本,我们需要设置解析这些参数的类
CELLConfig.hpp文件
#ifndef _CELL_CONFIG_HPP_
#define _CELL_CONFIG_HPP_
/*
专门用于读取配置数据
目前我们的配置参数主要来源于main函数的args传入
*/
#include<string>
#include<map>
#include"CELLLog.hpp"
class CELLConfig
{
private:
CELLConfig()
{
}
~CELLConfig()
{
}
public:
static CELLConfig& Instance()
{
static CELLConfig obj;
return obj;
}
void Init(int argc, char* args[])
{
_exePath = args[0];
for (int n = 1; n < argc; n++)
{
madeCmd(args[n]);
}
}
void madeCmd(char* cmd)
{
//cmd值:strIP=127.0.0.1
char* val = strchr(cmd, '=');
if (val)
{ //val值:=127.0.0.1
*val = '\0';
//cmd值:strIP\0
//val值:\0127.0.0.1
val++;
//val值:127.0.0.1
_kv[cmd] = val;
CELLLog_Debug("madeCmd k<%s> v<%s>", cmd, val);
} else {
_kv[cmd] = "";
CELLLog_Debug("madeCmd k<%s>", cmd);
}
}
const char* getStr(const char* argName, const char* def)
{
auto itr = _kv.find(argName);
if (itr == _kv.end())
{
CELLLog_Error("CELLConfig::getStr not find <%s>", argName);
} else {
def = itr->second.c_str();
}
CELLLog_Info("CELLConfig::getStr %s=%s", argName, def);
return def;
}
int getInt(const char* argName, int def)
{
auto itr = _kv.find(argName);
if (itr == _kv.end())
{
CELLLog_Error("CELLConfig::getStr not find <%s>", argName);
}
else {
def = atoi(itr->second.c_str());
}
CELLLog_Info("CELLConfig::getInt %s=%d", argName, def);
return def;
}
bool hasKey(const char* key)
{
auto itr = _kv.find(key);
return itr != _kv.end();
}
private:
//当前程序的路径
std::string _exePath;
//存储传入的key-val型数据
std::map<std::string, std::string> _kv;
};
#endif // !_CELL_CONFIG_HPP_