1 Star 0 Fork 0

周乃青/LinuxLearning

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
CalTask.cpp 2.29 KB
一键复制 编辑 原始数据 按行查看 历史
周乃青 提交于 2024-02-21 20:01 +08:00 . TcpServer done
#pragma once
#include <string>
#include "ThreadPool.cpp"
#include "Protocol.cpp"
enum{
Div_Zero = 1,
Mod_Zero,
Other_Oper
};
class CalTask{
private:
int socketfd_; //网络通信文件描述符
std :: string ip_; //客户端ip
uint16_t port_; //客户端端口号
std::string package_; //客户请求字符串
public:
CalTask(int socketfd,const std::string& ip , uint16_t & port,std::string & str)
: socketfd_(socketfd),ip_(ip),port_(port),package_(str){}
CalTask(){}//类一定要有默认构造函数
~CalTask(){}
public:
//执行计算任务并将结果发送给用户
void operator() (){
std::cout << "Task Running ... \n" << std::endl;
std::string content;
//将用户发送的报文进行解包获取正文
bool r = Decode(package_, content);
if (!r)return;
//将报文正文进行反序列化
Request req;
r = req.Deserialize(content);
if (!r)return ;
req.DebugPrint();
content = "";
//构建计算结果
Response resp = CalculatorHelper(req);
resp.DebugPrint();
//计算结果序列化成字符串
resp.Serialize(content);
//字符串正文封装成报文发送给用户
std::string ResStr = Encode(content);
write(socketfd_,ResStr.c_str(),ResStr.size());
if(socketfd_ > 0)close(socketfd_);
}
private:
Response CalculatorHelper(const Request &req){
//构建请求回应结构体
Response resp(0, 0);
switch (req.op){
case '+':
resp.result = req.x + req.y;
break;
case '-':
resp.result = req.x - req.y;
break;
case '*':
resp.result = req.x * req.y;
break;
case '/':{
if (req.y == 0)
resp.code = Div_Zero;
else
resp.result = req.x / req.y;
}
break;
case '%':{
if (req.y == 0)
resp.code = Mod_Zero;
else
resp.result = req.x % req.y;
}
break;
default:
resp.code = Other_Oper;
break;
}
return resp;
}
};
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/c-learning--c_0/LinuxLearning.git
git@gitee.com:c-learning--c_0/LinuxLearning.git
c-learning--c_0
LinuxLearning
LinuxLearning
master

搜索帮助