你的基本思路是正确的,就是在发送数据之前把数据的长度添加在数据之前,便于收到后进行解析。
创新互联专注为客户提供全方位的互联网综合服务,包含不限于做网站、网站设计、鄱阳网络推广、重庆小程序开发公司、鄱阳网络营销、鄱阳企业策划、鄱阳品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供鄱阳建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com
不过你这个在稍微有点异常的情况下就可以引起系统崩溃,因为一旦“长度”部分可能是乱码,因而引起后面数据的访问越界。
比较科学的做法就是为payload数据增加包头(包括前导码、数据描述)和包尾(包校验码),通过一系列的校验,首先验证包的数据是正常的,然后再从包中吧数据解析出来。
通讯协议数据包的话,前面放你用来判断你这个包所做事情的功能码,然后后面接数据所占字符的长度,最后一段是你要发送的数据,可以是数组也可以是结构体,看你喜欢
CMD是你要做的事
LENGTH是你后面数据的长度,方便你读数据
INFO是你的数据,你想发什么都行
解包你就从CMD开始用if,else来判断,找到对应的读取里面的内容,做你这个判断要做的事。
而相对复杂点的协议变色前面的判断内容更多的,比如控制变电所的设备,那就增加哪个变电所,变电所哪台设备,数据格式变化不大,基本都是承载在tcp,udp,.modbus这类协议上面,这些都是数据内容,是你自己定义的
当然可以,协议是具有层次的,协议的目的就是让通信双方能明白自己正在传输的是怎样的数据格式。
TCP/IP是一种比较通用的通信协议,在windows中采用socket组件库实现,是对协议通信功能的一种封装,
如你要发送一个信息(数据如“MSG”)从A到B,那么A将“MSG”打包成“4MSG”,第一个字节“4”表示这个数据包长度为4,那么接紧接的3个字节就是数据,那么这里就是一个协议,只是这个协议很简单,属于你自己开发的协议,而TCP这些协议属于开放协议,大家都知道标准,因此只要收到一个TCP数据包,那么你就可以根据协议分析你收到的数据包的格式是什么,数据包协议中,一般在数据包的开始部分定义了固定格式的信息,如TCP包头中包含了数据长度,目的的IP地址等很多信息。
如果你收到一个数据包,你不清楚它是什么格式的,那么你怎么解析呢,根本无法解析的,当然如果人工打开这个数据包进行数据内容与已知的协议比对,也许可以猜出它是什么格式。
看数据包的传送过程,
程序A:sengPackage("MSG"){ 调用TCP协议函数sendTCPPackage("4MSG");};
sendTCPPackage(char *pkg){调用IP协议函数sendIPPackage(TCP头+“4MSG”)};
sendIPPackage(char *pkg){调用MAC协议函数sendMACPackage(IP头+“TCP头+4MSG”)};
sendMACPackage(char *pkg){调用驱动发送数据包sendPkg(MAC头+“IP头TCP头+4MSG”)};
这里仅仅是用函数调用的描述解释协议实现的原理:协议的分层在编写程序时体现的就是一个调用层次关系。
在接收方,其实就是调用相同层级的函数对收到的数据包进行解包,把去掉本层头部的数据包传给上层调用函数,
如getPackage(char *buffer){
buffer = getTCPPackageData(buffer);
return buffer +1; // 去掉开始的一个字节。这里就是我自己定义的协议解包过程。
}; //buffer是收到的数据包。
char * getTCPPackage(char *buffer){
buffer = getIPPackageData(buffer);
buffer = 去掉TCP包后的数据包; // TCP包解包过程,IP,MAC的解包一样。
return buffer;
}
如HTTP是建立在TCP协议上,那么TCP包的数据部分就包含了HTTP的协议头部以及HTTP的数据部分。也就是说协议分层中,任何上层的协议被打包后的数据包(注意其中包含有协议头)被下层协议当做一个纯数据处理,下层协议并不清楚你上层怎么组织数据的。
因此我们只要能获得任何一层的协议调用函数接口,就可以采用该层协议来传输数据,我们如果能获得MAC层的调用函数接口,那么直接打包成MAC传输也可以,只是MAC的格式中不包含TCP、IP这些信息,数据包到达路由器的时候就不知道发给哪个电脑了,除非路由器知道MAC地址是哪个电脑,并且路由器支持MAC包的转发。因此需要用什么协议,是根据需要来确定的。
采用共用协议,目的是让通信过程更加通用,使系统可以通过已知的网络进行连接。