老大难问题,TCP接收粘包

sssanton 2014-11-17 03:54:05
现在的情况是这样:
GPRS终端设备发送4KB大小的图片数据到服务器,会分成15-25个左右的包。
暂时的方案是:
每个包定义了文件头和尾,用逗号按数据类型分隔数据,每个包的数据包含了当前包号,总的包数量。
服务器每收到一个包就将其内部计数+1,再和包号对比,直到当前包号和总的包数量相同(成功接收到最后一个包)则将图片数据组合起来。
如果某一个接收到的包号和服务器内部计算的不匹配,则清空计数。
接收缓冲区的大小为10K

问题就来了:在我自己的电脑上用软件模拟终端图片的分包发送,没啥问题(发送和接收在同一个电脑上)。但在其他机子上发送,则似乎接收的服务器出现了粘包问题,文件头和尾错乱了。

.NET FRAMEWORK 3.5
那么求解决办法或更好的现实方案。
...全文
432 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
於黾 2014-11-17
  • 打赏
  • 举报
回复
不丢包的话,为什么会慢 丢包的话,为了不慢,就直接丢弃了,那之后还能找到吗,数据整个不完整,再快有什么用
xdashewan 2014-11-17
  • 打赏
  • 举报
回复
引用 6 楼 sssanton 的回复:
本想这样干,但发送一个图片速度太慢的话又会有其他问题。
你4k文件为何细分的那么小?传输模块对大小有限制?
sssanton 2014-11-17
  • 打赏
  • 举报
回复
引用 4 楼 xdashewan 的回复:
[quote=引用 3 楼 sssanton 的回复:] 原先终端有比较严正的丢包现象,就这样勉强做了。看来还是不行。 按你这样,应该要加个定时器去判断发送超时吧?
一来一回模式,你发一包数据,我回复一个是否正常的回复,你接到正常的回复再发下一包数据,依次类推,中途如果丢包可以指定一方在超时未收到数据时发送重新信息,以便回复丢包导致的错误[/quote] 本想这样干,但发送一个图片速度太慢的话又会有其他问题。
xian_wwq 2014-11-17
  • 打赏
  • 举报
回复
TCP保证了数据不会错乱 按lz所述包头已经携带了数据长度, 那根据长度来拆分数据流就可以避免粘包 如果数据错乱,先不要怀疑tcp, 先去找业务层 拼包解析逻辑的问题
xdashewan 2014-11-17
  • 打赏
  • 举报
回复
引用 3 楼 sssanton 的回复:
原先终端有比较严正的丢包现象,就这样勉强做了。看来还是不行。 按你这样,应该要加个定时器去判断发送超时吧?
一来一回模式,你发一包数据,我回复一个是否正常的回复,你接到正常的回复再发下一包数据,依次类推,中途如果丢包可以指定一方在超时未收到数据时发送重新信息,以便回复丢包导致的错误
sssanton 2014-11-17
  • 打赏
  • 举报
回复
引用 2 楼 xdashewan 的回复:
既然知道总长那何不先发一包指定长度信息包,通知文件总长度,然后每包按定长发送过去,最后一包不足长度定义补位字符,拿到后按长度截位,然后把数据拼起来就是全部了
原先终端有比较严正的丢包现象,就这样勉强做了。看来还是不行。 按你这样,应该要加个定时器去判断发送超时吧?
xdashewan 2014-11-17
  • 打赏
  • 举报
回复
既然知道总长那何不先发一包指定长度信息包,通知文件总长度,然后每包按定长发送过去,最后一包不足长度定义补位字符,拿到后按长度截位,然后把数据拼起来就是全部了
於黾 2014-11-17
  • 打赏
  • 举报
回复
既然你已经发送了每个包的标识和长度,就自然能够知道到哪里是截止,后面的拼接到下一个包里不就得了 或者你每次发送固定的长度来区分也行

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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