网络编程(8)自定义网络通讯协议

2023-05-16

        C/C++网络通讯真正要用起来,不但要写一个好的网络服务器,还要定好一套通讯协议才能真正实用。
通讯协议业界目前除了用开源的如XMPP以外,基本上都是自定义一套通讯协议,自已负责封包,拆包。
为什么要自己定义协议包呢?一个原因是因为真正的业务逻辑往往都是复杂的,不会是很单纯的字符串或数字。再参考前面写的<< 网络编程(7)字节序对跨平台数据传输的影响>>就应当知道,通讯时网络传输是以字节为单位的。这一串串数据流在交互,如何能在数据流每次交互中正确识别出,
真正有用的东西,就要双方定义一套方法。发送方把要传输的东东放在一起定义好包,转成网络字节序发送出去。接收方收到后,再按包的定义,拆解出有用的数据。

包定义各有各的搞法,但通常会包含下面几部份:
     包类型 :用于业务逻辑区分
     内容长度  :  传输数据的长度
    消息内容  :  本次实际要传输的数据
    校验位  : 检查用,防止错包出现


包通常都是结构体,可以这样定义:
typedef struct _Packet{
	unsigned short pkg_type;
	unsigned int pkg_len;
	char pkg_content[pkg_len];
	unsigned short pkg_cs;
}Packet;

也可以这样:
typedef struct _PacketHeader{
	unsigned short pkg_type;
	unsigned short pkg_len;
}PacketHeader;

typedef struct _PacketBody{
	struct _PacketHeader pkg_header;
	char pkg_content[pkg_len];
	......
}Packet;
或者其它别的方式。
通常都会用宏或函数将这些结构体即 包体内容转成网络字节序(char)转给接收方,接收方再去解析它们即解包。
前面说了定义包的一个原因,另外原因之一是,在数据传输中,并不老是一帆风顺能得到你想要的
结果的,可能会出现其它意外,倒致你没有收到完整的数据,或收到的数据不是你想要的。而完善的通讯协议能
有效的检测完整性和区分出你想要的数据。
列几种例外情况
粘包: tcp为了提高效率(使用Nagle算法)会缓冲N个包后再一起发出去.
分包: 数据不全,数据不是一次,而是分几次到达。
非法包: 传过来的数据流不符合协议。这个要通过比较包类型,包长,效验位去检测出来。

 总之要弄个实用的网络通讯要考虑的东东很多,要写好这类程序真的很难。


MAIL: xcl_168@aliyun.com

BLOG: http://blog.csdn.net/xcl168




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

网络编程(8)自定义网络通讯协议 的相关文章

随机推荐

  • 寻路算法 Astar A星算法

    lt span style 61 34 white space pre 34 gt lt span gt lt span style 61 34 white space pre 34 gt lt span gt 首先是创建一些变量 lt p
  • eclipse调试C代码时printf()不能输出到控制台的解决方法

    1 问题 在ecplise下使用CDT开发C C 43 43 程序中 xff0c 使用debug调试时 xff0c 到了printf 打印函数 xff0c 在console窗口中并没有打印出信息来 xff0c 停止后才会有输出 2 原因 在
  • C语言中带参宏定义

    include lt stdio h gt 1 带参宏定义中 xff0c 宏名和形参表之间不能有空格出现 2 宏定义中不存在值传递 xff0c 它只是一个符号的替换过程 3 带参宏定义中 xff0c 形参不分配内存空间 xff0c 因此不必
  • kaldi新手入门及语音识别的流程(标贝科技)

    kaldi新手入门及语音识别的流程 标贝科技 欢迎体验标贝语音开放平台 地址 xff1a https ai data baker com source 61 qaz123 xff08 注 xff1a 填写邀请码hi25d7 xff0c 每日
  • 结构体字节对齐详解【含实例】

    一 前言 结构体字节对齐属于老生常谈的问题 xff0c 看似简单 xff0c 却很容易忘记 而且因为结构体使用的普遍性 xff0c 使得字节对齐也成为了一个不得不谈的话题 二 什么是结构体字节对齐 假设现在有一个结构体如下 xff0c 问你
  • Mina基础(五):编写自定义协议及编解码器

    为什么要制定协议呢 xff1f 我们知道 xff0c 底层传输的都是二进制数据 xff0c 服务端和客户端建立连接后进行数据的交互 xff0c 接受这对方发送来的消息 xff0c 如何判定发送的请求或者响应的数据结束了呢 xff1f 总不能
  • c++之存储类

    C 43 43 存储类 存储类定义 C 43 43 程序中变量 函数的范围 xff08 可见性 xff09 和生命周期 这些说明符放置在它们所修饰的类型之前 下面列出 C 43 43 程序中可用的存储类 xff1a autoregister
  • STM32串口通信 中断配置

    一 关于如何配置通过中断的方式配置串口的收发 xff0c 一共就是这8个步骤 1 使能串口时钟 使能GPIO时钟 2 引脚复用映射 3 GPIO端口模式设置 4 串口参数初始化设置 5 开启中断初始化NVIC 6 使能串口 7 编写中断处理
  • altium designer导出bom表和贴片图

    altium designer的简单使用 xff0c 做一下记录 1 导出bom表 xff0c https jingyan baidu com article cb5d6105133e8f005c2fe0fe html 2 导出贴片图 xf
  • 基于RPLIDAR激光雷达开发无人机机载室内二维重建装置(2)——RPLIDAR测试

    从官网上 xff08 http www slamtec com xff09 下载开发用的SDK及数据手册等相关资料 xff0c 但Arduino相关资料貌似已失效 xff0c 之后尝试从其他渠道下载 先安装对应系统的驱动 xff0c 之后打
  • Visio2016与office2016安装解决方法终极版

    基本解决方案 删除注册表 office软件在我们日常生活中的应用十分广泛 xff0c 在购买电脑时大部分会给电脑装上office家庭版 xff0c 但是有些人由于工作需要可能使用office更多的功能 xff0c 因此可以选择安装专业版 而
  • 微带天线学习

    微带天线学习 侧馈矩形微带天线同轴馈电矩形微带天线双频微带天线 学习方法是根据HFSS软件学习微带天线的优化 参数计算 xff0c 以及根据HFSS仿真结果进一步理解微带天线中参数对天线性能的影响 微带天线贴片尺寸计算方法及matlab代码
  • Zotero IEEE trans期刊cls格式调整

    Zotero IEEE trans期刊cls格式调整 Zotero软件自带的IEEE期刊的引用格式不符合期刊投稿要求 xff0c 因此需要改变cls文件 xff0c 改变引用格式 cls格式编辑网站 xff1a https editor c
  • ADS2021安装

    1 ADS简介 先进设计系统 Advanced Design system xff08 ADS xff09 Agilent Technologies 是领先的电子设计自动化软件 xff0c 适用于射频 微波和信号完整性应用 2 ADS的安装
  • Mysql整体介绍(适用于5.X版本)(上)(标贝科技)

    标贝科技 https ai data baker com source 61 qwer12 填写邀请码fwwqgs xff0c 每日免费调用量还可以翻倍 Mysql整体介绍 xff08 适用于5 X版本 xff09 标贝科技 Mysql 8
  • TE、TM、TEM模式的区别

    在一众电磁仿真软件的使用中 xff0c 牵涉到平面波的设置或Floquet端口的设置 在设置平面波时 xff0c 论坛里有不少人提到TE波 TM波 xff1b 在设置Floquet端口时 xff0c 又有不少人提到TE极化 TM极化 其实
  • linux下TCP socket编程入门案例(二)——非阻塞的TCP server&client

    文章目录 1 相关概念介绍1 1 阻塞与非阻塞1 2 两者区别1 3 select模型 2 编码实现2 1 代码改进2 2 实现服务端客户端 3 运行结果 在 上一篇 阻塞的TCP server amp client 中 xff0c 介绍了
  • cartographer 主从机rviz订阅地图出错

    cartographer 主从机rviz订阅地图出错 配置及想法 机器人以及虚拟机都是ubuntu16 43 kinetic xff0c 本意想在虚拟机端查看机器人cartographer的建图情况 直接在虚拟机端运行命令 rviz d t
  • TCP的连接和建立(三次握手和四次挥手)

    1 TCP连接的建立 连接的建立 xff0c 通常称为三次握手 建立连接前服务器处在收听状态 第一步 xff1a 客户机的TCP向服务器的TCP发送连接请求报文段 同步位 61 1 这时客户进程进入同步已发送状态 第二步 xff1a 服务器
  • 网络编程(8)自定义网络通讯协议

    C C 43 43 网络通讯真正要用起来 xff0c 不但要写一个好的网络服务器 xff0c 还要定好一套通讯协议才能真正实用 通讯协议业界目前除了用开源的如XMPP以外 xff0c 基本上都是自定义一套通讯协议 xff0c 自已负责封包