C++中TCP/IP按约定报文协议接收数据完成拼包
来源:互联网 发布:淘宝卖家秀和买家秀 编辑:程序博客网 时间:2024/05/29 16:32
有段时间没有更新博客了,近来比较忙,没有顾上写博客。终于完成了一个大任务,有时间回顾一下这段时间的成果。这篇博客,先介绍和总结一下很久前的工作。TCP/IP接收数据拼包。由于时间太长很多东西记不清楚了,请见谅。
任务是某设备通过WIFI以TCP/IP的协议发送图像数据,数据按照规定的报文协议接收数据。
报文内容分为控制域(8个字节)与数据域(不定长),报文的启动字符为0628H占两个字节,接下来两个字节是报文长度(除去控制域本身之外的所有字节长度,因此加上启动字符在内的完整的报文为报文长度的值+8个字节)。控制域后面4个字节预留。数据域前2个字节为数据类型,接下来2个字节为数据内容长度,接下来2个字节为帧类型,接下来2个字节标志位标示是否有后续帧,然后是真正的图像数据内容(由于图像数据内容很大,一帧报文数据可能发不完,因此分多帧发送,后续帧标志位就标志某一帧图像数据是否发完)。
然后约定,所有数据类型按小端对齐(低字节在前。当然也可以约定大端对齐,高字节在前。)
好的,协议定好,接下来就开始发送数据和接收数据把。不过,发送数据的工作不在我这边,我只负责接收。不过,发送数据的工作跟接收数据的工作可以互相参考一下。整理一下我的任务,我需要通过TCP接收发过来的数据,识别出启动字符和报文长度,然后按报文长度的值接收报文。接收完一帧报文后,开始解包操作。由于一帧完整的图像可能分多帧报文发,所以,解包的时候需要注意是否有后续帧,数据是否完整了。
好,网上如何TCP接收数据的代码很多,先上代码。
其中,涉及到缓存区的数据处理,主要是memcpy,memmove等函数的使用,且buffsize,expectedPacketSize等数据大小的使用。buffsize不仅可以表示目前recbuff缓存区已经存入的数据大小,而且还表征了下一帧要存放的数据地址。而expectedPacketSize=-1可以用于判断某次recv接收到的数据是否完毕,是否含有报文的开头,不等于-1的时候又可以表示期望获得的完整一帧报文的数据大小。
由于TCP/IP的限制,一帧很大的报文需要分次多次发送,这样就需要将多次发送过来的包进行拼包处理,已避免粘包等情况。
以上是我用C++的拼包的代码。希望有用哈~
时间太长,很多别的东西记不住了,就先这样吧,我得去忙了。
- C++中TCP/IP按约定报文协议接收数据完成拼包
- C++中TCP/IP按约定报文协议接收数据完成拼包
- tcp-ip : tcp接收数据
- DB11 TCP数据协议拆包接收主要方法
- c#中tcp协议服务器同时接收客户端的数据
- TCP/IP 之TCP协议(1):概述和报文格式
- 《LwIP协议栈源码详解——TCP/IP协议的实现》以太网数据接收
- IP数据报、TCP报文、UDP报文格式
- Java TCP/IP协议学习笔记:分组报文和协议
- TCP/IP协议、报文格式、三次握手协议
- TCP协议中报文段详解
- TCP协议发送数据:TCP 协议接收端(服务端)数据,
- TCP/IP第四层--传输层TCP数据报文详解
- TCP/IP第四层--传输层TCP数据报文详解
- Linux TCP/IP 协议栈源码分析 - 数据 发送/接收 流程图
- TCP IP详解(6)Internet控制报文协议
- TCP/IP协议学习备忘之ICMP报文重定向
- TCP/IP(6)ICMP Internet控制报文协议
- Who's in the Middle poj 2388
- 【codeforces 749B】 Parallelogram is Back
- 5-10 公路村村通
- PAT-乙级1008:数组元素右移问题
- 课后作业 课本NP-complete证明题
- C++中TCP/IP按约定报文协议接收数据完成拼包
- 常用类
- xml自动提示
- 读取配置文件properties的简单方式
- Spring学习笔记(一)
- React基础
- 终结解决Java Web开发过程中的中文乱码问题
- leetcode题解 632. Smallest Range
- Java并发编程:volatile关键字解析