网络编程(8)自定义网络通讯协议
来源:互联网 发布:python dom 修改xml 编辑:程序博客网 时间:2024/05/29 18:49
C/C++网络通讯真正要用起来,不但要写一个好的网络服务器,还要定好一套通讯协议才能真正实用。
通讯协议业界目前除了用开源的如XMPP以外,基本上都是自定义一套通讯协议,自已负责封包,拆包。
为什么要自己定义协议包呢?一个原因是因为真正的业务逻辑往往都是复杂的,不会是很单纯的字符串或数字。再参考前面写的<<网络编程(7)字节序对跨平台数据传输的影响>>就应当知道,通讯时网络传输是以字节为单位的。这一串串数据流在交互,如何能在数据流每次交互中正确识别出,
真正有用的东西,就要双方定义一套方法。发送方把要传输的东东放在一起定义好包,转成网络字节序发送出去。接收方收到后,再按包的定义,拆解出有用的数据。
包定义各有各的搞法,但通常会包含下面几部份:
包类型 :用于业务逻辑区分
内容长度 : 传输数据的长度
消息内容 : 本次实际要传输的数据
校验位 : 检查用,防止错包出现
包通常都是结构体,可以这样定义:
也可以这样:
通常都会用宏或函数将这些结构体即包体内容转成网络字节序(char)转给接收方,接收方再去解析它们即解包。
前面说了定义包的一个原因,另外原因之一是,在数据传输中,并不老是一帆风顺能得到你想要的
结果的,可能会出现其它意外,倒致你没有收到完整的数据,或收到的数据不是你想要的。而完善的通讯协议能
有效的检测完整性和区分出你想要的数据。
列几种例外情况
粘包: tcp为了提高效率(使用Nagle算法)会缓冲N个包后再一起发出去.
分包: 数据不全,数据不是一次,而是分几次到达。
非法包: 传过来的数据流不符合协议。这个要通过比较包类型,包长,效验位去检测出来。
通讯协议业界目前除了用开源的如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
0 0
- 网络编程(8)自定义网络通讯协议
- 网络通讯和网络协议
- 网络通讯协议简介(网络基础)
- 第9将 网络编程-怎样理解应用程序协议和网络通讯协议的关系
- java基础----网络协议及网络通讯
- 网络通讯协议
- 如何基于TCP/IP协议进行MFC Socket网络通讯编程
- 如何基于TCP/IP协议进行MFC Socket网络通讯编程
- 黑马程序员——网络编程1:网络通讯原理简介
- 使用套接字Socked实现网络通讯(网络编程)
- 网络通讯协议术语释义
- Modbus 网络通讯协议
- TCP UDP协议网络通讯
- 网络通讯-协议、IO浅述
- 网络通讯协议和分层
- 网络编程--TCP协议
- 网络编程--UDP协议
- 网络编程 MIME协议
- 利用nid更改数据库的名称(OCM--->OCP)
- MyBatis配置数据源
- JavaScript中两个感叹号(!!)的作用
- CAN、I2C、SPI、PCI总线简介
- GEF-自定义Request、Command与Action
- 网络编程(8)自定义网络通讯协议
- angularJS自定义过滤器使用
- Eclipse 的快捷键以及文档注释、多行注释的快捷键
- 常用的正则表达式
- 类加载器
- python理论学习(六)
- C语言的数组名和对数组名取地址
- Oracle SQL Plus Tutorial 学习笔记
- JSP CMS 管理系统