代码拉取完成,页面将自动刷新
#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;
}
};
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。