当前位置: 首页 > news >正文

【Linux】自定义协议——网络计算器实现

📝前言:

这篇文章我们来讲讲Linux——自定义协议,序列化和反序列化

🎬个人简介:努力学习ing
📋个人专栏:Linux
🎀CSDN主页 愚润求学
🌄其他专栏:C++学习笔记,C语言入门基础,python入门基础,C++刷题专栏


目录

  • 一,套接字缓冲区
  • 二,序列化和反序列化
    • 1. jsoncpp
    • 2. Json::Value
    • 3. Json::FastWriter 和 Json::Reader
  • 三,守护进程
    • 1. 补充知识
    • 2. 作业
      • 2.1 作业状态
      • 2.2 作业控制
    • 3.守护进程
  • 四,代码实现

一,套接字缓冲区

  • TCP 和 UDP 套接字都有内核维护的缓冲区。当调用read()时,数据并非直接发送到网络,而是从用户空间拷贝到套接字的发送缓冲区。
  • 当数据拷贝到套接字缓冲区时,内核会帮我们把数据通过网络传送到另一个主机的套接字缓冲区中(也就是说:数据在网络中的实际传输由操作系统内核负责,应用程序无需关心底层细节)
  • 再由对方调用read()把数据从缓冲区拷贝回他的用户层

在这里插入图片描述
注意:因为TCP协议是面向字节流的,所以我们无法确定我们read得到的是 0.5个/ 1个 / 1.5 个报文,即:我们需要设置分隔符等方法来:确保接受报文的单个完整性

二,序列化和反序列化

  • 数据能传:为了使数据传输更方便,我们通常先将数据序列化统一,然后方便网络的传输,另一方收到了以后,再反序列化得到原来的数据。
  • 数据能懂:为了确保数据的规范(或者说让对方能知道数据的含义),我们通常会制定协议(即:规定)

1. jsoncpp

安装:sudo apt-get install libjsoncpp-dev ,如果不行,可能是apt-get没有更新到最新版本,应该先执行:sudo apt-get update
安装好后,头文件在:#include <jsoncpp/json/json.h>

2. Json::Value

Json::Value 本质上就是 JSON 序列化 / 反序列化流程中的 “中间站” 和 “结构化数据容器”,结构化的数据和字符串json都会中途存储在 Jason::Value
在这里插入图片描述

3. Json::FastWriter 和 Json::Reader

  • Json::FastWriterwrite用于序列化
  • Json::Readerparse用于反序列化

注意:serverclient序列化反序列化要处理的数据是不同的

client → server

  • client需要将3+2表达式序列化,然后传输给server
  • server需要将接收到的3+2反序列化,然后调用cal计算(业务)

server → client

  • server将得到的结果:5序列化传输回去
  • client收到后,反序列化得到5

我们把client的操作封装到Request中,把server的操作封装到Response

三,守护进程

1. 补充知识

一些基本概念:

  • 进程组:进程是以进程组的形式完成任务的,组长进程的ID和进程组ID一样
  • 会话:是多个进程组的集合
    • 一个终端创建的时候就有一个会话
    • 如果会话销毁了,OS会向里面的进程组发送SIGHUP 信号(挂断信号),即:里面的进程都会销毁
    • 会话也有ID(SID)
    • 当登陆Xshell的时候,就是创建会话,bash进程独立成一组,成为该会话的首进程,并且会打开文件描述符012

:为什么终端运行了新进程以后,终端就无法响应ls等命令。
:因为键盘只有一个,即:所以一次会话中有且只能有一个前台进程组,占用标准输入。当我们在bash运行新进程的时候,新进程会继承bash的文件描述符012,新进程作为前台进程,此时bash会被切换到后台,所以不会得到前台的标准输入。

2. 作业

作业:在当前终端会话中启动用来完成某些任务的进程或进程组

2.1 作业状态

在这里插入图片描述

2.2 作业控制

  • jobs:查看作业列表
    在这里插入图片描述

  • &:启动时加&默认到后台运行

  • Ctrl+Z:挂起,向前台进程组的所有进程发送 SIGTSTP 信号(挂起信号),前台进程组立刻暂停

  • fg:将作业切回前台
    在这里插入图片描述

  • bg:将挂起作业恢复至后台(只能对暂停作业恢复),参数和fg一样

3.守护进程

终端创建的时候会创建会话,如果终端关了,会话就被销毁了,会话中的进程就会销毁。

和终端切除关联:setsid() 函数

  • 为调用进程创建新的会话,并成为该新会话的首进程,与原终端切除关联了
  • 调用setsid()进程不能是组长进程
    • 避免进程组组长:先通过 fork() 创建子进程,让父进程退出,再让子进程调用 setsid()(因为有父进程,所以子进程一定不是组长)

切断与终端交互:dev/null文件

  • 写入这个文件的内容都会被丢弃,从这个文件里面读到的内容都是空
  • 守护进程往往要把012给关了,或者重定向,因为守护进程不与终端交互

设计守护进程的系统调用daemon

#include <unistd.h>
int daemon(int nochdir, int noclose);
  • daemon的核心是setsid()
  • 参数
    • nochdir:是否保留原工作目录
      • 1:保留
      • 0:不保留,切换到/目录(推荐)
    • noclose:是否保留标准流
      • 1:保留
      • 0,不保留,重定向到dev/null文件(推荐)

四,代码实现

请访问我的GIthub——Netcal

运行时,查看进程信息,可见TTY → ?(即:关联到任何交互式终端,已为守护进程)
在这里插入图片描述


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

http://www.dtcms.com/a/391160.html

相关文章:

  • Ubuntu 安装的docker-compose拉取镜像失败问题处理办法
  • 第35篇:AI前沿:具身智能(Embodied AI)与通用人工智能(AGI)
  • LangChain 入门到精通企业项目实践之 LangChain 聊天模型
  • crush情感分析项目01
  • 免费插件分享 | Missing References Search
  • ECU OTA测试
  • Jenkins运维之路(Slave容器节点)
  • Amazon Lambda + API Gateway 实战,无服务器架构入门
  • 芯片管脚的源电流与漏电流
  • Django+ARIMA微博舆情预警系统 SnowNLP情感分析 Echarts可视化 机器学习 大数据项目✅
  • SIMetrix 8.30仿真蓝牙天线上的无源滤波器
  • [x-cmd] 升级 x-cmd 指南
  • AXI4-Stream总线流控握手实战经验总结
  • RAWSim-O-main项目Trae解析
  • react固定容器标签超出n+展示
  • ​​HarmonyOS应用开发:从入门到实战的完整指南​
  • QT与GTK生态最新进展及特性对比(2025年)
  • 包管理器分析
  • XC7K325T-2FBG676I Xilinx AMD Kintex-7 FPGA
  • FPGA入门-红外遥控
  • qml实现多页面切换显示的导航栏
  • 20250919的学习笔记
  • iOS 26 游戏测试实战,兼容性、帧率、GPU 性能与 Liquid Glass 动效在游戏中的影响(游戏开发与 uni-app 场景指南)
  • kind部署K8S集群并将“修仙业务“部署到kind集群
  • 《C++程序设计》笔记p2
  • 第1章:项目前言
  • 实现类似word 文档下划线输入功能
  • AR技术赋能高风险作业:重塑安全与效率
  • Axure-图片旋转人机验证
  • web:ts中class、interface、type的区别