socket发送分包问题求解

fox2338 2011-10-25 10:05:02
大家好!小弟不才,学socket学到现在,还是有很多问题。
下面来求教一个分包的问题。
规定一个包的包头是S,包尾是E。接收端按照一次1024个字节来接收。
假如说我要发送8888个字节。我发送端按照协议装包之后,包中有该包的字节总长度(包的长度),还有包头,包尾,一次性发送这个包。
我接收端按照1024字节接收一次。这样的话,问题来了,我如何来判断接收完毕?

我开始的时候根据包的包头和包尾来判断,如果说接收到的这1024字节以S开始,我就默认为这个是含有包头的数据。假如说

原先已经接收到数据但是并没有接收完的(接收到的数据中没有包尾E标记,则默认为不完整的包),我就放弃原先接收到的

数据,然后来接收新的数据包。似乎这样看起来没什么问题,但是考虑到这样一种情况,就不知道如何处理了。假如我接收到

的第二个包,其实它只是我整个包的一部分,它恰恰以S为头,这样的话,我不就是以丢包现象来处理原先已经接收到的第一

个包了吗?还有第二个包,正好以E结尾,那么它不就被处理为接收到一个完整的包了吗?

假如说按照包的字节总长度来判断这个包是否已经接收完毕,假如接收到的数据产生丢包现象,我接收到了最后一个包,恰恰

这个包它没有包尾E(丢包了),现在又接收到了一个新数据,数据中以S开头(其实它是一个新的包),这样的话,我不是按

照旧的包的一部分来处理了吗?

不知道大虾们有没有好的方法呢?尽量不在发送端发送的时候,就人为的进行分包发送。只想在接收端分包接收,然后判断合

包。
...全文
173 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
boss_kg 2011-10-26
  • 打赏
  • 举报
回复
你可以在包的最后面添加一个校验码,在那边接收到一条完整的数据后校验通过那当然就是正确的了。。不通过就是有问题的啊。。
轻狂小疯 2011-10-26
  • 打赏
  • 举报
回复
学习学习!!!!!!!!!!!!
ouyang4683 2011-10-26
  • 打赏
  • 举报
回复
客户端先发4字节的数据长度
再发数据

服务端先收4字节,得到长度以后再收包
ouyang4683 2011-10-26
  • 打赏
  • 举报
回复
客户端先发4字节的数据长度
再发数据

服务端先收4字节,得到长度以后再收包
ouyang4683 2011-10-26
  • 打赏
  • 举报
回复
客户端先发了4字节长度,
然后服务端先收4字节,根据这个长度再收下一包
只在此山中 2011-10-26
  • 打赏
  • 举报
回复
udp可能需要包加序号,接收后重组,主要在跨路由或发送速度大于接收.
tcp如果收到头或尾,判断字节数不对,只有丢弃或重发.
只在此山中 2011-10-26
  • 打赏
  • 举报
回复
udp可能需要包加序号,接收后重组,主要在跨路由或发送速度大于接收.
tcp如果收到头或尾,判断字节数不对,只有丢弃或重发.
山东蓝鸟贵薪 2011-10-26
  • 打赏
  • 举报
回复
socket没有研究成功,也想学习学习
只在此山中 2011-10-26
  • 打赏
  • 举报
回复
用udp可能有顺序的问题,可以标明包序号重组,不过很少,主要发生在跨路由或发送速度大于接收速度.
tcp收到头或尾,判断总字节数不对,只有丢弃或重发.
黄亮 2011-10-25
  • 打赏
  • 举报
回复
同问,最近要写socket

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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