c语言的结构体是面向对象吗,基于面向对象的思想来使用结构体,将会有意想不到的效果...

2023-11-05

225d39c1e9c8914f5afad54927b20751.png

程序开发过程中,很多人都会接触到客户服务端模型,通常客户服务端模型是基于socket的网络通信,而网络通信是需要定义通信协议,通信协议结构一般是用结构体的方式来表示,而数据内容有的可能会使用json格式,对于嵌入式设备,数据内容更多的还是采用结构体的方式来表示。

本文首先会基于Qt提供的socket接口来实现一个简单的客户服务端模型,主要是为后面数据内容采用结构体通信的说明提供基础。接着定义通信协议结构体,然后再说明C语言方式使用结构体的方法,再介绍基于面向对象的思想来使用结构体,从而体会两者方式之间的区别,最后再介绍如何采用模版方式来更好地获取结构格式不定的数据内容。

一、客户服务端模式

baa25f6bd4cd0abb01fa76e3f4b5ca4d.png

客户服务端模式的机制是,服务端启动监听端口来等待客户端的连接,客户端创建socket启动连接,服务端成功接收到连接之后,等待客户端发送数据,客户端开始发送数据,服务端接收到数据,并进行解析处理。

下面会基于QT提供的socket接口来实现简单的客户服务端模型,实现之前需要在pro文件中添加network库的支持。

e8c84c671760cf4f1de27a5faff86a42.png

1、定义实现简单的服务端类JTcpServer, 首先构造函数创建QTcpServer对象用来启动监听等待新的连接,当有新的连接请求的时候,则通过QTcpServer提供的接口nextPendingConnection来返回连接成功的socket, 然后等待客户端发送数据,如果有可读数据,那么读取数据进行处理。

686d93144ea20b617c94b45206e6e46d.png

a97b287840c5dd73fc360eff6a9beece.png

2、定义实现简单的客户端类,构造函数创建QTcpSocket用来连接服务端,并且发送数据。

d49d55feec5f66374ae1a2839a97aba6.png

3、完成客户端和服务端的实现,启动两个分离线程来分别执行客户端和服务端代码

82dab2ed425276114314c93c5abec12c.png

4、启动运行之后,可以看到服务端成功打印了客户端发送的数据,这说明客户端和服务端之间是能够通信的。

f707cc4631752146109cfabe3ea374a0.png

二、通信协议

a50407ef9c86aa3297e0c2e9542c4fdc.png

定义客户端和服务端的通信协议,它包括帧号,该帧号具有唯一性;帧类型,根据具体业务场景进行定义,比如命令帧、结果帧等;帧的来源表示网络帧的发送者; 帧的目的表示网络帧的接受者;数据帧长度则存储数据内容的具体长度; 数据则存放不定长度的数据内容。

三、基于C语言方式的结构体

基于C语言方式定义通信协议的结构体

fc2d94e976447fa2e56a08931eafd0af.png

再定义数据内容的结构体

c018246776cb42a789e50a1738056179.png

客户端构建数据,并发送。首先malloc申请内存,然后填充帧头和数据内容,最后发送数据,再free释放内存。

b6b9ccad2beccc84d255941e9f9f3601.png

服务端接收数据,并解析。服务端接收全部数据,然后解析并打印出来。由于TCP是流的方式,一般来说,先解析帧头,再解析帧数据,但是这里暂时不需要关注,所以没有考虑。

2b998badcb2f7d357a51bf7f92faa4c5.png

四、基于面向对象的结构体

上面的方式是基于C语言的方式来使用结构体,接下来就来说明如何基于面向对象的方式来使用结构体。

基于面向对象方式定义通信协议的结构体

9b7eda081db967569e6197c4f691f471.png

基于面向对象方式定义数据内容结构体

9854d14a4cca12a4badcc715a7c40c9f.png

构建客户端数据,并且发送数据。为了避免申请内存而忘记释放,这里使用std::vector数组来存储发送的数据,这样就避免忘记释放内存。

a22456ed8757fa2bc51ac7832b09be19.png

服务端接收数据,并且解析数据。

890e5f8842780af86f735815f1e9adac.png

五、模版方式获取数据内容

服务器接收数据的内容的长度是不确定,不同的应用场景对应不同的结构体。为了统一、并且简化代码量。可以实现模版方法来获取数据内容。

ff4bf159a525455cef64d74327aec53f.png

那么服务端接收数据内容,就可以调用模版方法。

ab88a89fb7a3a02225f930461747c393.png

六、总结

本文通过实现一个简单的客户服务端模型来说明C语言定义的结构体和面向对象定义的结构体的区别,通过面向对象定义的结构体可以在构造函数中初始化数据成员,这样就不必每次定义对象,还需要使用memset来初始化结构体,同时也避免了忘记初始化结构体的可能性。另外一个,我觉得可以很好简化代码量,并且让代码统一的一个点就是,使用模版方法来解析帧的数据内容。除了解析帧的数据内容之外,还可以通过模版方法来构建帧的数据内容,这样不同结构体,只需要一个模版方法就可以解决。所以,使用面向对象的设计语言的时候,尽量用面向对象的设计思想来开发,很多时候可以简化代码,甚至简化代码的逻辑。

举报/反馈

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言的结构体是面向对象吗,基于面向对象的思想来使用结构体,将会有意想不到的效果... 的相关文章

  • win操作iOS UI自动化(tidevice+appium)

    1 安装 tidevice 使用命令 pip install tidevice 2 使用数据线连接手机 打出命令 tidevice list查看连接状态和udid 若有信息返回则连上 3 输入启动命令 启动wda包 tidevice u 设
  • Java链表-合并两个有序链表

    如何将两个有序链表合成一个新的有序链表 基本思想 定义一个新链表 定义一个新链表的指针tempNode 当合并的两个链表的头节点指针都不指向空时 比较两个链表节点的值 找到里面较小的值的地址 让新链表的指针tempNode下一个节点指向该最
  • 数据分析基础目录

    自从大数据技术火热之后 现在数据分析也火热了 至少我就有两个女同事转数据分析失败哈 不是我不帮她们 实在是帮不动 哈哈 这两个人都是英语专业的 一个是文学学士 一个是文学硕士 专业跨得太大了 但是我想说我转数据分析肯定会成功的 不因为别的
  • gitlab ci 使用

    gitlab ce与gitlab runner使用 采用docker方式运行gitlab ce 运行两个gitlab runner 一个运行在容器中 另一个安装在宿主机上 运行gitlab ce和gitlab runner容器 下载镜像 d
  • 【统计学习方法-李航-笔记总结】二、感知机(感知机的原始形式与对偶形式)

    本文是李航老师 统计学习方法 第二章的笔记 欢迎大佬巨佬们交流 主要包括以下几部分 1 感知机模型 2 感知机策略 3 感知机算法 1 感知机模型 感知机是二分类的线性分类模型 其输入为实例的特征向量 输出为实例的类别 取 1和 1两个值
  • 用OpenPose做一个运动量测量器

    代码 https github com B C WANG AI Apps tree master openpose app MotionMeasure 通过openpose获得肢体关键点的位置信息 利用脖子位置作为中心点求得相对位置 然后用
  • Windows MYSQL跳过密码登录以及密码修改

    MYSQL跳过密码登录以及密码修改 1 以管理员身份打开命令行 输入命令 net stop mysql 如果不是管理员身份 可能会出现如下错误 2 开启跳过密码验证登录的MySQL服务 在命令行输入 mysqld console skip
  • 神经网络是如何训练的,神经网络是怎么训练的

    想要学习人工神经网络 需要什么样的基础知识 人工神经网络理论百度网盘下载 链接 提取码 rxlc简介 本书是人工神经网络理论的入门书籍 全书共分十章 第一章主要阐述人工神经网络理论的产生及发展历史 理论特点和研究方向 第二章至第九章介绍人工
  • 机械臂抓取前言

    一 机械臂的一些相关概念 自由度 除去末端执行器一个机械臂上有几个电机就是几自由度机械臂 二 机械臂的抓取流程 1 读取深度摄像头的数据 2 在摄像头传输过来的图像中识别要抓取的物体 并且得到想要抓取物体的二维的像素坐标 3 将二维像素坐标
  • IDEA让包分层显示的方式

    IDEA中java包分层显示的方式 初次使用IDEA的朋友 有部分的包显示是如此显示 但是这么显示 有时会因为包的同级显示 使得包使得包的显示过多 此时就可以改变显示的方式 小齿轮 gt gt Flatten Packages Middle
  • usbcan系列便携式can分析仪

    简介 USBCAN系列便携式CAN分析仪 通过USB接口快速扩展一路CAN通道 使接入CAN网络非常容易 它具有一体式和小巧紧凑的外形 特别适合于随身携带 CAN接口采用金升阳电源模块和信号隔离芯片实现2500V DC电气隔离 USB接口E
  • 前端Vue自定义得分构成水平柱形图组件 可用于系统专业门类得分评估分析

    引入Vue自定义得分构成水平柱形图组件 cc horBarChart 随着技术的发展 传统的开发方式使得系统的复杂度越来越高 一个小小的改动或小功能的增加可能会导致整体逻辑的修改 造成牵一发而动全身的情况 为了解决这个问题 我们采用了组件化
  • 官方推荐U盘安装Ubuntu 10.10 方法

    通用USB Installer是一个Linux系统安装器 允许你从你的USB闪存驱动器选择安装一个Linux发行版 通用USB安装器使用非常方便 只需选择一个 Linux发行版的ISO文件和你的U盘便能进行安装 Universal USB
  • java用模板生成word(docx)文档(含动态表格)

    生成word思路 用WPS或者office编辑好word的样式 然后另存为word xml文档 将xml翻译为FreeMarker模板 最后用java来解析FreeMarker模板并输出Docx 编辑好需要使用的word文档 1 把需要注入
  • 在Linux上面如何部署jar包?

    1 首先打开工具Xshell或者FinalShell 并登录 2 使用 ll 命令查看根目录文件 确定jar包将要放到哪个位置 使用cd 命令进入文件 如 cd opt yt 3 新建文件传输 可和本地关联 4 将jar包直接拖过去就行 5
  • 树的遍历(中序,前序,后序)

    与只有一种逻辑遍历它们的线性数据结构 数组 链表 队列 堆栈等 不同 树可以以不同的方式遍历 常见的有中序遍历 前序遍历和后序遍历 实现各种遍历的方法又包括 以上图为例 深度优先遍历 a 中序 左 根 右 4 2 5 1 3 b 前序 根
  • 关于async & await(TAP)异步模型的异常捕获

    在TAP之前 若要捕获线程中Task的异常 通常有两种办法 1 阻塞 线程开始后 在适当的时机 调用 wait 或waitAll方法 2 非阻塞 推荐 在建立任务的时候 写该task的continueWith方法 在该方法中捕获异常 对于T
  • get提交和post提交的区别

    Http定义了与服务器交互的不同方法 最基本的方法有4种 分别是GET POST PUT DELETE URL全称是资源描述符 我们可以这样认为 一个URL地址 它用于描述一个网络上的资源 而HTTP中的GET POST PUT DELET
  • Linux安装以及使用

    Linux虚拟机安装以及使用 1 安装VMware16 2 创建虚拟机 3 虚拟机配置网络 4 利用mobaxterm连接服务器 5 配置jdk和tomcat 6 配置docker和mysql 7 部署项目 1 安装VMware16 接下来

随机推荐

  • leetcode160–相交链表(最优解/双指针)

    今天做的三道题比较简单 给你两个单链表的头节点 headA 和 headB 请你找出并返回两个单链表相交的起始节点 如果两个链表不存在相交节点 返回 null 题目数据 保证 整个链式结构中不存在环 注意 函数返回结果后 链表必须 保持其原
  • ISA(MIPS,ARM,RISC-V)中的算术运算溢出检测逻辑是怎样的?

    关于ISA架构 之前写过一些总结 这里单独将其中一个技术点拿出来 对比分析不同架构下实现的差异 这个技术点就是算术指令中的溢出检测 ARM体系结构中 通过CPSR的状态寄存器反映当前指令的溢出状态 而MIPS 则是通过指令触发中断的方式产生
  • Jenkins使用(代码拉取->编译构建->部署上线)

    Jenkins简介 Jenkins是一个开源项目 提供了一种易于使用的持续集成系统 使开发者从繁杂的集成中解脱出来 专注于更重要的业务逻辑实现上 同时Jenkins能实时监控集成中存在的错误 提供详细的日志文件和提醒功能 还能用图表的形式形
  • Java——(1)定义一个学生类Student,包含属性:姓名(String name)、年龄(int age) (2)定义Map集合,用Student对象作为key

    分析以下需求 并用代码实现 1 定义一个学生类Student 包含属性 姓名 String name 年龄 int age 2 定义Map集合 用Student对象作为key 用字符串 此表示表示学生的住址 作为value 3 利用四种方式
  • db2异常

    一 db2 SQL0180N The syntax of the string representation of a datetime value is incorrect SQLSTATE 2200 问题描述 在用import导入时没有
  • qt入门级使用

    qt的安装 可参考 QT下载安装及配置教程 亲测好用 qt基本使用 1 创建第一个qt程序 打开后欢迎界面如下 这是关于qt的一些项目的讲解 不过视频地址在国外 需要翻qiang才能看 而且全是英文 左边还有一个 示例 那里面有各种项目的模
  • Android开发之RecyclerView的使用全解

    转自 http blog csdn net dmk877 article details 50816933 自Android 5 0之后 谷歌公司推出了RecylerView控件 RecylerView 我想看到一个新名词后大部分人会首先发
  • 微分动态规划

    from https en wikipedia org wiki Differential dynamic programming 深入理解DDP DDP是一种轨迹优化类别问题中的最优控制算法 这种算法在1966年被Mayne提出 该算法使
  • PostgreSQL 性能优化

    提出问题 PostgreSQL数据库如何进行简单的性能调优 解决问题 前言 PostgreSQL的配置参数作为性能调优的一部分 起着重要的位置 有时候一个简单的配置参数就会决定应用的性能 因此有必要简单了解下其相关的配置参数 查询Linux
  • Hadoop(三)读写流程

    Remote Procedure Call RPC 远程过程调用协议 它是一种通过网络从远程计算机程序上请求服务 而不需要了解底层网络技术的协议 RPC协议假定某些传输协议的存在 如TCP或UDP 为通信程序之间携带信息数据 在OSI网络通
  • 数据库基础命令

    SELECT 从数据库中提取数据 SELECT column name column name FROM table name SELECT DISTINCT column name column name FROM table name
  • Numpy

    文章目录 1 Numpy是什么 2 ndarray 2 1 什么是ndarray 2 2 ndarray的属性 2 3 ndarray的类型 3 Numpy基本操作 3 1 生成0或1的数组 3 2 从现有数组生成数组 拓展 浅拷贝和深拷贝
  • 在Excel中如何引用其他的工作表或者工作簿

    http www office68 com excel 426 html 公式中对单元格和单元格区域的引用不必非得针对同一个工作表中的单元格和单元格区域 如果要引用另外的工作表中的单元格 那么就在单元格引用的前面加上工作表的名称以及一个感叹
  • ssl协议及开源实现openssl

    转载地址 https blog csdn net jinbusi blog article details 76039206 locationNum 4 fps 1 ssl协议 SSL Secure Socket Layer 安全套接层 s
  • Rsync的核心算法

    一 什么是Rsync 1 rsync 是 unix linux 下同步文件的一个高效算法 它能同步更新两处计算机的文件和目录 并适当的利用查找文件中的不同块以减少数据传输 2 rsync中一项与其他大部分类似程序或协定中所未见的重要特性是镜
  • Delphi 对象的创建(create)与释放(free/destory)

    create后一定要free吗 简单举例 procedure a var x TX begin x TX create do someting x free 如果我这里不free 到了这个end不就是相当于C中的 自动释放吗 也就是说在此处
  • Android 基础知识4-3.10 ScrollView(滚动条)详解

    一 简介 首先来看google官方对他的介绍 翻译过来就是可以滚动的用户布局容器 如果手机显示不下子布局 那么可以使用scrollView 当然谷歌也说NestedscrollView已经提供了更好的用户体验 这个我们以后再详细总结下 谷歌
  • 批量处理sql表

    1 批量CRUD表字段 DECLARE V SQL VARCHAR2 2000 V TABLE NAME VARCHAR2 30 CURSOR C1 IS 查询当前用户下 ZFPT40 STATISTIC ANALYSIS 的所有表 SEL
  • 数据结构:循环链表的使用

    循环链表 循环链表 将单链表中终端结点的指针端由空指针改为指向头结点 就使整个单链表形成一个环 这种头尾相接的单链表称为单循环链表 简称循环链表 如图所示 非空的循环链表如图 循环链表与单链表的主要差异在于循环的判断上 原来是判断p gt
  • c语言的结构体是面向对象吗,基于面向对象的思想来使用结构体,将会有意想不到的效果...

    程序开发过程中 很多人都会接触到客户服务端模型 通常客户服务端模型是基于socket的网络通信 而网络通信是需要定义通信协议 通信协议结构一般是用结构体的方式来表示 而数据内容有的可能会使用json格式 对于嵌入式设备 数据内容更多的还是采