首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

sokect send 速度控制,该怎么处理

2012-03-30 
sokect send 速度控制例如我有个500MB的文件,现在我想以500KB/S的速度,相对稳定的发送出去。这个改这么控制

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-=实际发送量

热点排行