• 7059阅读
  • 1回复

socket限速问题 [复制链接]

上一主题 下一主题
离线scerzz
 

只看楼主 倒序阅读 楼主  发表于: 2006-05-18
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
写了个传文件的函数,为了实现限速,使用的是线程睡眠

就是传送一定字节后睡眠线程,睡眠后再继续写数据

qt版本是
4.1.1

发现个问题,
当write数据后,程序返回了写入的数据
然后我用waitForBytesWritten来等待数据的传送完,如果数据传送过多就睡眠

问题就是这里,好象线程睡眠后数据就不传送了,然后等所有要写入的数据全部写入完后(一个while循环写入),socket才开始传送(当然在睡眠那过程中还是有点数据传送的,但和实际设定的不符合,等数据全部写入完毕后,数据就会不停的往客户那边传输,速度超过预想的,应该是最大速度传输了)

我现在希望的就是写入数据后,能够怎么样确认是否数据真的已经传送到客户,且中间使用时间
本来想以waitForBytesWritten来实现,但好象不行。
有其他限速方面的方法也说一下啊,主要是学习socket编程,不是太懂啊


以下是代码
  1. while(1)//进入无限循环传输数据
  2.    {
  3.        if(bufferseek >= buffersize)//缓存读取完毕
  4.        {
  5.            buffer.clear ();
  6.            if((havewrite+buffersize)>prefile->len)
  7.            {
  8.                readFile(seek,(prefile->len-havewrite),buffer);
  9.            }
  10.            else
  11.            {
  12.                readFile(seek,buffersize,buffer);
  13.            }
  14.            bufferseek = 0;
  15.            pcbuffer = buffer.data();
  16.        }
  17.        if(ratelimit>(buffer.size()-bufferseek))
  18.        {
  19.            eachwrite = pwsocket->write(pcbuffer,buffer.size()-bufferseek);
  20.        }
  21.        else
  22.        {
  23.            eachwrite = pwsocket->write(pcbuffer,ratelimit);
  24.        }
  25.        
  26.        //bytetowrite -= eachwrite;
  27.        bufferseek+=eachwrite;
  28.        havewrite +=eachwrite;
  29.        pcbuffer += eachwrite;
  30.        passtime.start();
  31.        if(!pwsocket->waitForBytesWritten (100000))
  32.        {
  33.            pwsocket->disconnectFromHost();
  34.        }
  35.        else
  36.        {
  37.            unsigned long sleeptime = (unsigned long)((float)eachwrite/(float)ratelimit)*1000;
  38.            if(sleeptime > 0)
  39.            {
  40.                sleeptime -= passtime.elapsed();
  41.                //configs.writeLog(QString::number(sleeptime));
  42.                pthread->dtsleep(sleeptime);
  43.            }
  44.        }
  45.        if(havewrite>=prefile->len)
  46.        {
  47.            break;//完毕退出循环
  48.        }
  49.        if(!pwsocket->isValid ()) break;//判断连接是否断开
  50.        
  51.    }
[ 此贴被XChinux在2006-05-18 15:30重新编辑 ]
离线scerzz

只看该作者 1楼 发表于: 2006-05-18
对不起,看落个函数
flush()//将写入缓存的数据发送出去
接触QT没多久,很多函数都不知道哦
快速回复
限100 字节
 
上一个 下一个