需要实现一个SOCKET TCP通信Server端会向Client每秒发送300个数据包,数据包格式是自定义的,大小固定30个字节Client接收数据的时候,前面接收的数据包都是正确的,但后面收到的包出现数据错误的现象把Server发送速度降低到每秒发送150个数据包都OK没问题原来以为是Client接收缓存不够大,但改大缓存后每秒发300个包还是有问题,请问各位大虾这是什么原因造成的,有什么好的解决方法?

解决方案 »

  1.   

    在send时,把包合并,按照64K为一个单位发。接收时,也按照64K单位recv,不够64K,有多少接多少。收取够,64K,再检查包你的协议,如果不是应答式,按照上面说的。
      

  2.   

    不错的解决办法,照你的方法做确实可以解决问题,但很想知道发送速度太快造成数据包错误的原因是什么,是不是还存在什么隐患?我SOCKET采用的是阻塞方式,专门开了一个线程接收数据
      

  3.   

    客户端太快,如果服务端设计的不好,就会出现数据粘包,几个包被一起收了,而分包出现问题。
    主要还是所使用的recv模型的问题,阻塞方式没看到你的代码,不好确定具体原因。 
      

  4.   

    1:每个包中加个长度字段。
    2:你确认send都发送出去了吗?如果send的次数多,或有错误代码的,可能是socket系统缓冲区满,无法继续发送数据。
      

  5.   

    参考现成例子Http协议。Http会在发送前加一个totalLength,和一个tag。totalLength代表整个包的长度
    tag代表是哪个包,rev时,首先建立缓冲池,放入tag包,if totalLength== 缓冲区池全有tag length总和,则进行业务处理,相对于网页就是显示,else 继续wait,注意要给每个tag加上timeout.原因:底层收发数据时才不管你顺序问题捏,先发tag1包再发tag2,接收时是有可能先收到分组tag1包分组offset 1然后收tag2分组 offset1这样一来,不错就见鬼了。所以在会话层以上必须建立自己的标志。
      

  6.   

    对了,这个问题叫我想起一个超级风暴攻击,泪滴,泪滴就像LZ说的那样,在瞬间发送多个分组包给服务器,使得服务器疲于应付分组带来的等待,最终download,想比泪滴,DDOS就像是个好孩子,呵呵。