序列化和反序列化(Linux)

序列化和反序列化(Linux)

1 序列化和反序列化

write和read实质是拷贝函数

1.1序列化和反序列化的概述

2网络版计算器

2.1代码实现

先把日志拷贝过来

2.1.1必须先要有网络功能

先把 TcpServer.hpp编写号

#pragma once #include <cstdint> #include "Socket.hpp" #include "./logs/ljwlog.h" class TcpServer { public: TcpServer() {} bool InitServer() {} void Start() {} ~TcpServer() {} private: uint16_t port; }; 

2.1.2 把套接字接口封装一下方便使用

#pragma once #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <pthread.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/wait.h> #include <netinet/in.h> using namespace std; class Sock { public: Sock() {} ~Sock() {} public: void Socket()//创建套接字的接口 {} void bind()//绑定的接口 {} void Listen()//监听状态的接口 {} int Accept()//获取连接的接口 {} int Connect()//方便两个客户端和服务器都能使用这个Sock的这个公共方法 {} private: int sockfd_; };

2.1.3 TcpServer.hpp接口的补充

#pragma once #include <cstdint> #include "Socket.hpp" #include "./logs/ljwlog.h" class TcpServer { public: TcpServer() {} bool InitServer() { //先创建套接字,再绑定,设置监听状态 listensock_.Socket(); listensock_.bind(); listensock_.Listen(); } void Start() { while(true) { int sockfd = listensock_.Accept(); } } ~TcpServer() {} private: uint16_t port_; Sock listensock_; //叫listen套接字,Listen完后有真正的网络文件描述符 }; 

2.1.4 Sock.hpp接口的补充

#pragma once #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <pthread.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/wait.h> #include <netinet/in.h> #include <cstring> #include "./logs/ljwlog.h" using namespace std; enum{ 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_ < 0) { FATAL("Socket errno,error:%d,errstring:%s", errno, strerror(errno)); exit(SocketErr); } } void Bind(uint16_t port)//绑定的接口 { struct sockaddr_in local; memset(&local, 0, sizeof(local)); local.sin_family = AF_INET; local.sin_port = htons(port);//主机转网络 local.sin_addr.s_addr = INADDR_ANY;//ip默认0.0.0.0 if(bind(sockfd_, (struct sockaddr*)&local, sizeof(local)) < 0) { FATAL("Bind errno,error:%d,errstring:%s", errno, strerror(errno)); exit(BindErr); } } void Listen()//监听状态的接口 { if(listen(sockfd_, backlog) < 0) { FATAL("Listen errno,error:%d,errstring:%s", errno, strerror(errno)); exit(ListenErr); } } // 知道谁链接的我 int Accept(string *clientip, uint16_t *clientport)//获取连接的接口 { struct sockaddr_in peer;//远端的意思 socklen_t len = sizeof(peer); int newfd = accept(sockfd_, (struct sockaddr*)&peer, &len); if(newfd < 0) { WARN("accept error, %s: %d", strerror(errno), errno); return -1; } //网络转主机 //拿出客户端的ip和端口号 char ipstr[64]; inet_ntop(AF_INET, &peer.sin_addr, ipstr, sizeof(ipstr));//网络转主机 *clientip = ipstr;//网络转主机 *clientport = ntohs(peer.sin_port);//网络转主机 return newfd; } void Close() { close(sockfd_); } int Connect()//方便两个客户端和服务器都能使用这个Sock的这个公共方法 { return 0; } private: int sockfd_; };

2.1.4 TcpServer.hpp提供服务

2.1.5定制协议(Protocol)(约定好)

双方约定好,把请求放在Request(请求),结果放在Response(响应)

约定好了,最好就不要动他了

#pragma once #include<iostream> class Request { public: public: int x; int y; char op;// + - * / % }; class Response { public: public: int result; int code;// 0,可信,否则!0具体是几,表明对应的错误原因 };

2.1.6 (手写)序列化和反序列化

serialization 序列化(把struct 转换成 字符串)

deserialization 反序列化

2.1.6.1序列化
2.1.6.2反序列化
 2.1.6.3添加报头(要往网络里发 先添加报头)

这种

 

 2.1.6.4 提出有效载荷

Read more

【论文阅读 | Advanced Engineering Informatics 2026】融合条件扩散与图学习的 EEG 信号重建与认知负荷识别

📖 论文信息标题:Fusion-driven EEG reconstruction and cognitive workload recognition using conditional diffusion and graph-based learning期刊:Advanced Engineering Informatics 71 (2026) 104243DOI:10.1016/j.aei.2025.104243作者:Fariya Bintay Shafi, Md. Faysal Ahamed, Amith Khandakar*, Mohamed Arselene Ayari, Shahriar Islam Siyam机构:Qatar University(电气工程系、土木与环境工程系),Rajshahi University of Engineering & Technology(

By Ne0inhk

5个简单步骤:快速上手ElectronBot机器人表情动画系统

5个简单步骤:快速上手ElectronBot机器人表情动画系统 【免费下载链接】ElectronBot 项目地址: https://gitcode.com/gh_mirrors/el/ElectronBot ElectronBot是一款基于WALL-E中EVE角色设计的桌面级小型机器人,具备6个自由度运动控制和USB通信显示功能。这个开源项目最大的特色在于其参数化表情动画生成系统,让用户能够通过简单的参数调整快速创建丰富多样的机器人表情。本文将带你从零开始,掌握ElectronBot表情动画的完整使用流程。🎭 什么是ElectronBot表情动画系统? ElectronBot的表情动画系统基于参数化模型设计,通过调整关键参数值,能够实时生成各种生动有趣的机器人表情。这套系统位于项目的4.CAD-Model/Emoji/目录下,包含了兴奋、愤怒、惊恐、难过、不屑等多种基本表情,每个表情都由"进入-循环-退出"三个动画片段组成,确保表情切换时的平滑过渡。 步骤1:环境准备与项目搭建 获取项目源码 首先需要克隆项目仓库到本地: git clone https://g

By Ne0inhk
基于Matlab/Simulink平台的FPGA开发

基于Matlab/Simulink平台的FPGA开发

基于 Matlab/Simulink 平台进行 FPGA 开发是一种高效的 "算法驱动" 设计方法,尤其适合从算法原型到硬件实现的快速迭代,广泛应用于电力电子、通信、控制、图像处理等领域。其核心优势在于通过可视化建模和自动代码生成,减少手动编写 HDL(硬件描述语言)的工作量,同时保证算法与硬件实现的一致性。 一、FPGA建模与仿真 基于Simulink建模:使用Simulink搭建算法模型(如信号处理、控制系统等),通过仿真验证功能正确性。 定点化处理:通过Fixed-Point Designer工具将浮点算法转换为定点模型,优化硬件资源占用。 仿真验证:通过 Simulink 仿真验证模型功能正确性,重点测试边界条件和异常场景,确保算法逻辑无误。 二、FPGA代码生成 HDL Coder 是 MathWorks 公司推出的一款核心工具,主要用于将 MATLAB 算法和 Simulink 模型自动转换为可综合的硬件描述语言(

By Ne0inhk

3个步骤让你的Home Assistant界面焕然一新:智能家居UI设计全攻略

3个步骤让你的Home Assistant界面焕然一新:智能家居UI设计全攻略 【免费下载链接】lovelace-soft-ui💫 Simple and clean Lovelace configuration 项目地址: https://gitcode.com/gh_mirrors/lo/lovelace-soft-ui 你是否也曾被Home Assistant默认界面的单调布局困扰?繁杂的控件排列、生硬的色彩对比,让智能家居控制变成了一种负担。而lovelace-soft-ui的出现,正是为了解决这些痛点——通过简单的YAML配置,就能将普通控制界面升级为具有现代美感的交互中心。本文将带你从安装到定制,完成一次Home Assistant界面的优雅蜕变。 核心价值:让科技融入生活美学 想象这样一个场景:清晨醒来,你滑动手机查看家中状态,柔和的卡片式布局、恰到好处的阴影层次、协调的色彩搭配,让每个控制按钮都像精心设计的艺术品。这正是lovelace-soft-ui带给用户的核心价值——它不仅是界面美化工具,更是一种让智能家居回归生活本质的设计哲学。 图:左侧为默认界

By Ne0inhk