项目简介
在学习完c++,系统编程等基础内容以后,就在网上找了关于c++方面的项目,下面这个项目是练手项目之一,一个C/S模型的全栈项目,关于源代码和项目的简介网上不难找到,这里讲述一些我对该项目的理解,和对项目的改进、代码的优化。
该项目名为多端安全协议传输平台,它主要是提供为其他通信或者服务提供第三方服务,即保证甲方通信的安全传输。
该项目主要实现第三方传输平台客户端和服务端之间如何进行秘钥协商,以及第三方平台对数据信息的注册等。协商完的秘钥能够提供给甲方进行数据加密,甲方只需要一个外联接口就能够实现数据的加解密通信,并可以借助软件界面来注册网点、秘钥等信息。
总体流程:
1) 安装数据库,部署安全传输平台sql脚本方案
2) 密钥协商服务器器配置终端SecMngServerAdmin,添加网点信息,配置后台服务器启动参数
3) 启动密钥协商服务器(SecMngServer)后台服务程序
4) 启动密钥协商客户端程序(SecMngClinet),发起协商密钥
5) 第三方信息系统,通过外联接口(AppInterface),加解密
因为觉得该项目具有普遍性,延伸性,因此将该项目作为c++的练手项目,其中大部分函数代码的封装自己都重写了一遍,并且项目的代码进行了一些优化改进,在此过程中,感觉对c语言如何封装成c++语言有了更深刻的认知,对高并发通信有了更深刻的了解,提升了自己的代码能力。
代码完善和优化
-
功能的完善
源代码的功能只实现了秘钥协商的功能,在此基础上我将秘钥校验、秘钥注销、秘钥查看三个基础功能进行了完善
// 秘钥校验
int secKeyCheck(RequestMsg* reqMsg, char** outData, int& outLen);
// 秘钥注销
int secKeyRevoke(RequestMsg* reqMsg, char** outData, int& outLen);
// 秘钥查看
int secKeyView(RequestMsg* reqMsg, char** outData, int& outLen);
-
高并发机制的优化
源代码用的高并发机制是多线程并发,考虑到需要在线程里写业务,并且每个业务逻辑其实算是短连接,因此我觉得在这里改为
线程池并发
来优化并发的性能比较好,因为线程池能够减少线程创建和销毁的开销,在并发量变化比较大的情况下性能会比较好,不采用epoll是因为连接时间比较短,业务处理完即断开连接,无需每次循环对每个socket判断情况。
// 2. 等待并接受连接请求
while (1)
{
if (m_stop)
{
cout << "应用程序即将退出..." << endl;
break;
}
TcpSocket* socket = m_server.acceptConn(3);
tcpCon* pTcp = new tcpCon;
pTcp->server = this; pTcp->client = socket;
if (socket == NULL)
{
cout << "accept 超时或失败" << endl;
continue;
}
cout << "客户端成功连接服务器..." << endl;
// 加入任务的队列
threadpool_add(thp, wroking,(void*)(pTcp));
}
//线程池销毁
threadpool_destroy(thp);
-
一些代码的简化和改进
对其中一部分代码进行了简化和改进,比如修改了生成随机字符串的代码,改变了一些类的封装,对一些函数进行了传输判断,对函数返回值进行了些修改
//原生成随机字符串的函数
// char randBuf[64]; , 参数 64, randBuf
void ClientOperation::getRandString(int len, char * randBuf)
{
int flag = -1;
// 设置随机种子
srand(time(NULL));
// 随机字符串: A-Z, a-z, 0-9, 特殊字符(!@#$%^&*()_+=)
char chars[] = "!@#$%^&*()_+=";
for (int i = 0; i < len-1; ++i)
{
flag = rand() % 4;
switch (flag)
{
case 0:
randBuf[i] = rand() % 26 + 'A';
break;
case 1:
randBuf[i] = rand() % 26 + 'a';
break;
case 2:
randBuf[i] = rand() % 10 + '0';
break;
case 3:
randBuf[i] = chars[rand() % strlen(chars)];
break;
default:
break;
}
}
randBuf[len - 1] = '\0';
}
//修改以后生成随机字符串对的函数
void ClientOperation::getRandString(int len, char * randBuf)
{
int flag = -1;
// 设置随机种子
srand(time(NULL));
// 随机字符串: A-Z, a-z, 0-9, 特殊字符(!@#$%^&*()_+=)
for (int i = 0; i < len - 1; ++i)
{
char tmp;
while ((tmp = rand() % 128) < 32);
randBuf[i] = tmp;
}
randBuf[len - 1] = '\0';
}
项目总结
{
char tmp;
while ((tmp = rand() % 128) < 32);
randBuf[i] = tmp;
}
randBuf[len - 1] = '\0';
}
## 项目总结
该项目是一个比较全面性的项目,通过该项目的练习对客户端服务端通信业务流程有了进一步的认知,项目也有更进一步的优化空间,比如更加全面运用智能指针优化代码,客户端管理界面更加精美等。