我为了测试网络的负载压力情况,设置了一个发送数据的测试程序// 10s测试
while(GetTickCount() - start <10000)
{
send(s, buffer, 1024, 0);
// Sleep(1);
}发现当Sleep存在时能够完全收到数据,可是当注释掉以后,丢失数据很严重。
因为实际的数据量很快,所以存在很大的隐患,请问有办法解决吗?
谢谢了!
while(GetTickCount() - start <10000)
{
send(s, buffer, 1024, 0);
// Sleep(1);
}发现当Sleep存在时能够完全收到数据,可是当注释掉以后,丢失数据很严重。
因为实际的数据量很快,所以存在很大的隐患,请问有办法解决吗?
谢谢了!
使用sleep虽然简单,但是还不是最好,有可能太长,导致资源浪费,或者太短,还会出现数据丢失的现象。可以这样:
发送一定量的数据,等待对方一个回应信号采集需发送,利用waitforsingleobject()来等待一个事件
这种方法相当于通过接收方进行流控,我最近的几个项目都是这么做的,其中一个是通过CAN总线进行64个DSP单元的在线烧写,使用上只等待接收方的信号在进行发送,效果很好。
如果返回不成功就重发。
当你把本机的缓冲区填满以后,错误发生在你的机器上而不是在网络上。
之前一直以为TCP协议是可靠的数据传输协议,如果这样的的话,就不能够随便发送报文了?
请问是不是凡是数据量很多、很快时,都需要人工干预来控制网络的收发啊?
还有就是上面各位说的用事件量来进行同步,可是通常情况下,网络的收发是运行在不同的主机上的,这无法直接使用事件了,是不是需要通过TCP的网络连接进行回报数据状态啊?这不就会导致网络通信更加拥塞吗?谢谢大家。
TCP协议的可靠性就是靠校验,回报,重传机制来实现的,但不在应用层处理,send()的返回值就表示已经被接收方确认正确的字节数,看看拔掉网线的情况下send()的返回值吧。
数据量多就参考一下网络下载软件的做法:把文件打小包,断点续传。