_Linux (网络版计算器简易实现)

本文介绍了网络版计算器的实现,包括两种协议方案,一种是自定义的基于字符串的协议,另一种是使用JSON库进行数据交换。文章详细阐述了序列化和反序列化的过程,并提到了send和recv使用时的不安全性,以及如何通过添加长度信息确保数据完整性。此外,还讨论了守护进程的概念和实现方法,以确保服务器在用户退出后仍能持续运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 协议

  • 注意:我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层。
  • 协议是一种 “约定”

socket api的接口, 在读写数据时, 都是按 “字符串” 的方式来发送接收的. 如果我们要传输一些"结构化的数据" 怎么做呢?

  • 发送数据时将这个结构体按照一个规则转换成字符串, 接收到数据的时候再按照相同的规则把字符串转化回结构体。

2. 网络版计算器简易实现代码链接

3. 网络版计算器

2-1. 约定的协议方案有两种

约定方案一:

  • 客户端发送一个形如"1+1"的字符串;
  • 这个字符串中有两个操作数, 都是整形;
  • 两个数字之间会有一个字符是运算符, 运算符只能是 +
  • 数字和运算符之间没有空格。

约定方案二(我们的代码实现采用方案二):

  • 定义结构体来表示我们需要交互的信息;
  • 发送数据时将这个结构体按照一个规则转换成字符串, 接收到数据的时候再按照相同的规则把字符串转化回结构体;
  • 这个过程叫做 “序列化” 和 “反序列化”

注意:无论我们采用方案一, 还是方案二, 还是其他的方案, 只要保证, 一端发送时构造的数据, 在另一端能够正确的进行解析, 就是ok的. 这种约定, 就是应用层协议。

  • 当然我们自己简单实现的协议比较简陋(不能应用于任何场景);库里的json更强大。

2-3. 协议代码框架

结果和计算过程都有序列和反序列化

#pragma once

#include <iostream>
#include <string>
#include <cstring>
#include <sys/types.h>
#include <sys/socket.h>
#include <jsoncpp/json/json.h>

using std::cout;
using std::endl;
using std::string;

namespace ns_protocol
{
   
#define MYSELF 1

#define SPACE " "
#define SPACE_LINE strlen(SPACE)
#define SEP "\r\n"
#define SEP_LINE strlen(SEP)

    class Request //  计算数据
    {
   
    public:
        //  "_x _op _y"
        string Serialize() //  序列化
        {
   
#ifdef MYSELF
             //	自己模拟的协议
#else
            //	json
#endif
        }
        //  "111 + 222"
        bool Deserialized(const string &str) //  反序列化
        {
   
#ifdef MYSELF
             //	自己模拟的协议
             
#else
            // json

            return true;

#endif
        }

        Request() {
   }
        Request(int x, int y, int op) : _x(x), _y(y), _op(op)
        {
   
        }

    public:
        int _x;
        int _y;
        char _op; // '+' '-' '*' '/' '%'
    };

    class Response //  结果
    {
   
    public:
        //  _code _result
        string Serialize() //  序列化
        {
   
#ifdef MYSELF
             //	自己模拟的协议

#else
            // json
#endif
        }
        
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昨天;明天。今天。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值