行业知识
【Linux】简单的网络计算器的实现(自定义协议,序列化,反序列化)
2026-10-29 22:16:43
来源:互联网转载
文章目录
- 前言
- 一、 服务端
- 1.ServerCal.cc(服务器主文件)
- 2.ServerCal.hpp
- 3.Sock.hpp(套接字封装)
- 4.TcpServer.hpp(服务器)
- 5.Protocol(自定义协议)
- 二、用户端
- 1.ClientCal
- 三、Log.hpp(日志)
- 四、makefile
前言
���们需要实现一个服务器版的加法器. 我们需要客户端把要计算的两个加数发过去, 然后由服务器进行计算, 最后再把结果返回给客户端`
一、 服务端
1.ServerCal.cc(服务器主文件)
#include "TcpServer.hpp"#include "ServerCal.hpp"#include #include "Daemon.hpp"using namespace std;static void Usage(const string &proc){ cout if(argc!=2){ Usage(argv[0]); exit(0); } uint16_t port=stoi(argv[1]); ServerCal cal; TcpServer*tsvp=new TcpServer(port,bind(&ServerCal::Calculator,&cal,placeholders::_1)); //绑定服务器的回调函数 tsvp-InitServer();//初始化服务器 Daemon();//守护进程化 tsvp-Start();//启动 return 0;} Div_Zero = 1, Mod_Zero, Other_Oper};class ServerCal{public: ServerCal() { } 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; } // 传入的package形式:"len"\n"10 + 20"\n std::string Calculator(std::string &package) { std::string content; //Decode:去掉字符大小len和\n bool r = Decode(package, &content); // "len"\n"10 + 20"\n if (!r) return ""; // Decode后:"10 + 20" Request req; r = req.Deserialize(content); // 反序列化过程:"10 + 20" -x=10 op=+ y=20 if (!r) return ""; content = ""; //进行计算 Response resp = CalculatorHelper(req); // result=30 code=0; //result与code进行序列化放入content resp.Serialize(&content); // "30 0" //Encode:序列化后加上len与\n content = Encode(content); // "len"\n"30 0" return content; } ~ServerCal() { }}; SocketErr = 2, BindErr, ListenErr};const int backlog = 10;class Sock{public: Sock() {} ~Sock() { }public: void Socket() { sockfd_ = socket(AF_INET, SOCK_STREAM, 0); if (sockfd_
上一篇:服务器电缆怎么接线?