35_简易命令行脚本

为了避免在源程序中频繁设置某些变量(线程数量,客户端数量)的值,我们把这些变量设置为参数,通过设置命令行脚本的值,修改这些参数

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_

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top