我为了测试网络的负载压力情况,设置了一个发送数据的测试程序// 10s测试
while(GetTickCount() - start <10000)
{
    send(s, buffer, 1024, 0);
//  Sleep(1);
}发现当Sleep存在时能够完全收到数据,可是当注释掉以后,丢失数据很严重。
因为实际的数据量很快,所以存在很大的隐患,请问有办法解决吗?
谢谢了!

解决方案 »

  1.   

    那是因为你发送的太快了来不及接收导致缓冲区被冲掉
    使用sleep虽然简单,但是还不是最好,有可能太长,导致资源浪费,或者太短,还会出现数据丢失的现象。可以这样:
      发送一定量的数据,等待对方一个回应信号采集需发送,利用waitforsingleobject()来等待一个事件
    这种方法相当于通过接收方进行流控,我最近的几个项目都是这么做的,其中一个是通过CAN总线进行64个DSP单元的在线烧写,使用上只等待接收方的信号在进行发送,效果很好。
      

  2.   

    有sleep的时候,为什么丢失数据?
      

  3.   

    有sleep()的时候并不一定完全正确,你可以试试:数据量再加大,sleep()再缩短,发送间隔也缩短。
      

  4.   

    1楼的说的对!典型的数据通信同步问题,你在不停发送时,接收端不一定能和你的发送速度同步,即使在速度上同步,也不能保证任何时刻都完全同步,因此,就会有来不及收数据的情况出现! 而且还会大量占用CPU时间。典型做法是发送数据按照一定的大小,即每次发一个包(包大小自己根据实际情况决定),然后等待一个Event,此时发送端会处在等待状态,释放CPU。此时接收方接收到数据后,设置对应的Event,发送方就会接收到这个Event(这相当于一个回应), 然后再发送下一个包。例子可能不是非常恰当,但意思是一样的。如果你想测试网络负载能力,可以将数据包加大!
      

  5.   

    应该检测send(s, buffer, 1024, 0); 的返回值
    如果返回不成功就重发。
    当你把本机的缓冲区填满以后,错误发生在你的机器上而不是在网络上。
      

  6.   

    如果你用的是标准的SOCKET,那么你的send函数要重新封装,一般来说,它不一定能一次发送完毕的
      

  7.   

    要看send的返回值,返回值表达了发送是否成功,如果>0则表示已发送的字节数,楼主的这种压力测试不够好,应该创建多个连接或多个socket同时进行发送
      

  8.   

    刚刚了解到错误不是在接收部分,而是发生在发送缓冲区溢出上,并不是网络上丢数据。
    之前一直以为TCP协议是可靠的数据传输协议,如果这样的的话,就不能够随便发送报文了?
    请问是不是凡是数据量很多、很快时,都需要人工干预来控制网络的收发啊?
    还有就是上面各位说的用事件量来进行同步,可是通常情况下,网络的收发是运行在不同的主机上的,这无法直接使用事件了,是不是需要通过TCP的网络连接进行回报数据状态啊?这不就会导致网络通信更加拥塞吗?谢谢大家。
      

  9.   

    应用层,根本就不用考虑拥塞的情况。
    TCP协议的可靠性就是靠校验,回报,重传机制来实现的,但不在应用层处理,send()的返回值就表示已经被接收方确认正确的字节数,看看拔掉网线的情况下send()的返回值吧。
    数据量多就参考一下网络下载软件的做法:把文件打小包,断点续传。