小工具知识网

当前位置: 首页 > 行业知识 > 【Linux】简单的网络计算器的实现(自定义协议,序列化,反序列化)

行业知识

【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_ 

上一篇:服务器电缆怎么接线?

下一篇:windows服务器怎么上传文件?