sokect send 速度控制
例如我有个500MB的文件,现在我想以500KB/S的速度,相对稳定的发送出去。这个改这么控制好呢?
我现在是这样做的:
一次发送的大小是10KB,然后send前,我先根据
已经发送的总量(S总)
---------------------------- = 理想发送这些数据需要的时间 (T设)
设定的速度(V设)(例如:500KB/S)
然后再计算出发送到现在所消耗的时间:T消耗 = T现在 - T开始;
最后:T设 - T消耗 = T休眠时间(因为实际发送数据时间一般是比理想所需时间要小的,所以要休眠,否则这个速度就会很大很大了。)
如果T休眠 > 0就休眠这个时间长度
send()....
------------------------------------------------------
以上是我现在的做法,但是我发现这样的话,的却能够得到一些控制,但是波动太大了,上下可能波动达到了20KB/S。
不知道大家有没有什么好的方法。希望各位能指点指点。
[解决办法]
500k/s,每次10K,那么20ms发送一个包,那么必然要用到高精度定时器,另外500k/s接近5大概接近5M的带宽,网络是不是有瓶颈也是需要考虑的
想做好还是很复杂的
[解决办法]
不是这么控制的。
算法这样。
int avaliable=0;
const int checkPeriod=100; //100ms;
const int grow=512*1024/10;
DWORD lastCheck=GetTickCount();
while(!complete){
DWORD now=GetTickCount();
if(now-lastcheck>=checkPeriod){
lastcheck+=checkPeriod;
avaliable+=grow;
if(avaliable>grow)
avaliable=grow;
}else
if(avaliable<=0)
Sleep(lastcheck-now-checkPeriod+1);
else
complete=SendData(avaliable);
}
bool sendData(int &avaliable);//发送最大为avaliable字节的数据,返回时avaliable-=实际发送量