求教高手关于大数据量传输的解决方案

sesgli 2009-12-26 12:02:20
需要实现一个SOCKET TCP通信

Server端会向Client每秒发送300个数据包,数据包格式是自定义的,大小固定30个字节

Client接收数据的时候,前面接收的数据包都是正确的,但后面收到的包出现数据错误的现象

把Server发送速度降低到每秒发送150个数据包都OK没问题

原来以为是Client接收缓存不够大,但改大缓存后每秒发300个包还是有问题,

请问各位大虾这是什么原因造成的,有什么好的解决方法?

...全文
327 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tjzs007 2009-12-31
  • 打赏
  • 举报
回复
对了,这个问题叫我想起一个超级风暴攻击,泪滴,泪滴就像LZ说的那样,在瞬间发送多个分组包给服务器,使得服务器疲于应付分组带来的等待,最终download,想比泪滴,DDOS就像是个好孩子,呵呵。
tjzs007 2009-12-31
  • 打赏
  • 举报
回复
参考现成例子Http协议。Http会在发送前加一个totalLength,和一个tag。totalLength代表整个包的长度
tag代表是哪个包,rev时,首先建立缓冲池,放入tag包,if totalLength== 缓冲区池全有tag length总和,则进行业务处理,相对于网页就是显示,else 继续wait,注意要给每个tag加上timeout.

原因:底层收发数据时才不管你顺序问题捏,先发tag1包再发tag2,接收时是有可能先收到分组tag1包分组offset 1然后收tag2分组 offset1这样一来,不错就见鬼了。所以在会话层以上必须建立自己的标志。
red-fly 2009-12-31
  • 打赏
  • 举报
回复
最简单的就是,把几个包合并起来一起发送
如果查检当前的错误,可以在当前的状态下,把发送的内容逐个打印出来,在接收端,也把收到的内容逐个打印出来,看能不能对得上,如果对不上,那就有奇怪的问题了。如果对得上,那就要看是发送端发送的不对,还是接收端拆包不对
接收端不能按照每次都是30个字节来解析,而且要考虑到接收一半或者一个半包时的情况,否则,肯定会出问题的。
按照你300次,一次30个字节,数据量很小的,才10K不到,楼主还声称大数据量,想忽悠人吧
sesgli 2009-12-31
  • 打赏
  • 举报
回复
每个包都有包头的,包头中有记录包的长度,出现粘包以后就是解析包头的时候得到的包长度不对了

请问粘包是阻塞模式才会出现吗?其它模式会不会也有这样的问题?
vincent_1011 2009-12-30
  • 打赏
  • 举报
回复
不粘包是不可能吧,除非像你那样改发送间隔时间加长?
lijianli9 2009-12-30
  • 打赏
  • 举报
回复
1:每个包中加个长度字段。
2:你确认send都发送出去了吗?如果send的次数多,或有错误代码的,可能是socket系统缓冲区满,无法继续发送数据。
sesgli 2009-12-30
  • 打赏
  • 举报
回复
能否给一个不会粘包的设计实例参考一下
尘雨 2009-12-27
  • 打赏
  • 举报
回复
客户端太快,如果服务端设计的不好,就会出现数据粘包,几个包被一起收了,而分包出现问题。
主要还是所使用的recv模型的问题,阻塞方式没看到你的代码,不好确定具体原因。
尘雨 2009-12-26
  • 打赏
  • 举报
回复
在send时,把包合并,按照64K为一个单位发。接收时,也按照64K单位recv,不够64K,有多少接多少。收取够,64K,再检查包

你的协议,如果不是应答式,按照上面说的。

sesgli 2009-12-26
  • 打赏
  • 举报
回复
不错的解决办法,照你的方法做确实可以解决问题,

但很想知道发送速度太快造成数据包错误的原因是什么,是不是还存在什么隐患?

我SOCKET采用的是阻塞方式,专门开了一个线程接收数据

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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