背景:
    1.服务器端向客户端发送大量数据包( 64K )
    2.客户端一个线程recv接收数据,另外一个线程处理数据
问题:
    1.客户端偶尔会出现10055错误,系统缓存已满
      在不同的机器上会出现
    2.客户端接收的数据不完整,比如一个包大小为64K,但有时只从系统缓冲读取出
      <<< 64k ( 17K)作用,而且丢失包头,导致无法正确解析数据备注:服务端发送数据应该没有问题,无论是数据长度还是包内容我怀疑这2个错误是同一个原因导致
希望有经验的朋友给点建议
谢谢

解决方案 »

  1.   

    我遇到这个错误的情况是:接收了超过 4000 个连接后,一个windows 的 bug.之后就不能连接了。
    你的情况好像就是你读的速度赶不上对方发送的速度, 你可以一次多读一些,比如10个包的大小,让处理函数去区分包。
      

  2.   

    分包处理,一个包不要大于8k.
    tcp的缓冲默认大小是8k
      

  3.   

    实际上这个原因还是接收方处理速度不够,导致了接受缓冲区满,我也碰到这个情况,tcp发送数据的时候,有可能只发送一部分的,所以根本问题还是解决接受发的接收速度,或者在客户端做验证,我也一直在寻找问题的解决方法
      

  4.   

    谢谢楼上的   2.客户端接收的数据不完整,比如一个包大小为64K,但有时只从系统缓冲读取出
          <<< 64k ( 17K)作用,而且丢失包头,导致无法正确解析数据这个原因可能是什么原因导致的?
      

  5.   

    是tcp还是udp?如果只是缓冲区偶尔不足,可以调用setsockopt来增加缓冲区,这样肯定可以解决你说的问题;但感觉这个只是治标不治本,估计你还是要想办法减小数据包,从来没看过有人以此发这么大的数据包的。
      

  6.   

    1.一次接收一个包的大小,就不再接收
    2.处理缓冲区
    3.回到第一步
    必须收一次包大小的数据,处理一次,再收。
    缓存不够可能是没有delete 吧?
      

  7.   

    这个问题是比较棘手
    我测试过128K的包,也可以正常传输,但同样也会出现上述问题
    不是设置系统缓冲的问题---------------------------------------------------------------
     2.客户端接收的数据不完整,比如一个包大小为64K,但有时只从系统缓冲读取出
          <<< 64k ( 17K)左右,而且丢失包头,导致无法正确解析数据怎么会出现这种情况呢?发送端肯定正确的
      

  8.   

    lz用的是tcp协议吧,应该是接收端接收太慢,而发送端发送太快,如果用的是阻塞式socket,数据量超过缓冲区,send会阻塞,但是有一个超时的时间,过了时间缓冲区还没有释放,就会返回这个错误,lz试试改善一下接收和发送的速度数据不完整,如果是tcp协议,那肯定是接收或者发送端的问题咯,不容置疑
      

  9.   

    回头查了下资料,俺楼上的发言有误,默认是没有超时时间的,这个错误似乎是ms特有的,不知道其他系统有没有这个问题,ms的建议有3种方法:
    1、Use the socket in nonblocking or asynchronous mode.2、Break large-size data blocks into small ones and specify a relatively small buffer in send for blocking sockets, preferably no larger than 64K.3、Set the SO_SNDBUF socket option to 0 (zero) to allow the stack to send from your application buffer directly.建议楼主用2或者3试试,不过即使不返回错误,send也会堵塞,我想可能会影响你的业务,所以我觉得最好还是改善接收和发送的处理速度
      

  10.   

    分包是必要的,否则就会不稳定,在某些环境下会出错。要是速度跟不上,那就建议你改改协议吧。比如把tcp改为udp.这样会快许多。反正是局域网,估计传输错误应该不是很多,可以在校检上少花些时间。