TCP,传图片分包传送,第一次发送一个结构体,结构体包含本张图片的大小和其他的所需信息,为什么接收组包后只能收到第一张图片

DeaglePC 2018-04-01 10:09:13
1.经调试发现,如果断点运行是可以接收到几张图片的,到某个时候解析包头(结构体)的时候,发现是乱码,我解析都是按照接收的顺序,不放过每一个字节处理的,为什么会出现这种情况呢?
发包过程如下:
对于一张图片,首先发送一个结构体,包含了本张图片大小等信息,然后分多次发送图片数据,每次发1400字节
组包过程如下:
算法1:每次recv1400个字节,然后对于第一次接收的数据,取前20(sizeof(struct) = 20)字节作为结构体,然后后面的字节保存到缓存,因为此时知道图片大小,存够的话就把下面20个字节取出来作为结构体,但这样可以接收前面几张图片,到了后面就会失败,失败原因是解析到的结构体那20个自己是乱码(一些很大的数)
算法2:先取20字节,得到图片大小,然后recv图片大小,重复执行

上面的方法都可以正常接收几张图,但是都会发生解析到的结构体是乱码

发送放是一个死循环,不停的发送图片,当把发送改成只发2张图片,发现是可以收到的,但收到2张后又收到一串乱码- -
...全文
620 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
DeaglePC 2018-04-02
  • 打赏
  • 举报
回复
引用 1 楼 qq_36751214 的回复:
每次发送一张图片,开头没有同步标识吗,应该用几个字节标识是图片的第一个包,这样解析结构体不易出错。
嗯,我该考虑加个标识字节,但如果图片中的数据正好出现这标识呢? 说白了我就是解析的时候按照图片大小加结构体大小这样按顺序解析的
DeaglePC 2018-04-02
  • 打赏
  • 举报
回复
关于算法一,在处理不是1400倍数的时候,我是有处理的,比如接到图片最后一个包,是350字节,而图片还需要200字节,我会先把200字节放到图片缓冲区,然后剩下的150个字节,取20字节作为包头也就是结构体,然后剩下的130字节存入下张图片,奇怪的是我在慢速执行(断点调试的时候,有时候可以每次都正确解析出结构体的大小,有时候却不行)是不是发送和接收速度不同步的产生的问题?
宁南学者 2018-04-02
  • 打赏
  • 举报
回复
算法一,如果发生粘包情况,第二个图片已经后面的就会有问题,因为每次接收1400字节,如果图片不是1400字节倍数关系,接收的第二个图片头部放到第一个图片最后的1400字节,当读取下个1400字节的前20字节就会出现问题。 算法二:没有发现问题。
宁南学者 2018-04-02
  • 打赏
  • 举报
回复
每次发送一张图片,开头没有同步标识吗,应该用几个字节标识是图片的第一个包,这样解析结构体不易出错。
DeaglePC 2018-04-02
  • 打赏
  • 举报
回复
引用 4 楼 qq_19390147 的回复:
[quote=引用 1 楼 qq_36751214 的回复:] 每次发送一张图片,开头没有同步标识吗,应该用几个字节标识是图片的第一个包,这样解析结构体不易出错。
嗯,我该考虑加个标识字节,但如果图片中的数据正好出现这标识呢? 说白了我就是解析的时候按照图片大小加结构体大小这样按顺序解析的[/quote] 不好意思,我想多了,绝对不可能- - 谢谢您的热心回答

4,358

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧