写了个传文件的函数,为了实现限速,使用的是线程睡眠
就是传送一定字节后睡眠线程,睡眠后再继续写数据
qt版本是
4.1.1
发现个问题,
当write数据后,程序返回了写入的数据
然后我用waitForBytesWritten来等待数据的传送完,如果数据传送过多就睡眠
问题就是这里,好象线程睡眠后数据就不传送了,然后等所有要写入的数据全部写入完后(一个while循环写入),socket才开始传送(当然在睡眠那过程中还是有点数据传送的,但和实际设定的不符合,等数据全部写入完毕后,数据就会不停的往客户那边传输,速度超过预想的,应该是最大速度传输了)
我现在希望的就是写入数据后,能够怎么样确认是否数据真的已经传送到客户,且中间使用时间
本来想以waitForBytesWritten来实现,但好象不行。
有其他限速方面的方法也说一下啊,主要是学习socket编程,不是太懂啊
以下是代码
- while(1)//进入无限循环传输数据
- {
- if(bufferseek >= buffersize)//缓存读取完毕
- {
- buffer.clear ();
- if((havewrite+buffersize)>prefile->len)
- {
- readFile(seek,(prefile->len-havewrite),buffer);
- }
- else
- {
- readFile(seek,buffersize,buffer);
- }
- bufferseek = 0;
- pcbuffer = buffer.data();
- }
- if(ratelimit>(buffer.size()-bufferseek))
- {
- eachwrite = pwsocket->write(pcbuffer,buffer.size()-bufferseek);
- }
- else
- {
- eachwrite = pwsocket->write(pcbuffer,ratelimit);
- }
-
- //bytetowrite -= eachwrite;
- bufferseek+=eachwrite;
- havewrite +=eachwrite;
- pcbuffer += eachwrite;
- passtime.start();
- if(!pwsocket->waitForBytesWritten (100000))
- {
- pwsocket->disconnectFromHost();
- }
- else
- {
- unsigned long sleeptime = (unsigned long)((float)eachwrite/(float)ratelimit)*1000;
- if(sleeptime > 0)
- {
- sleeptime -= passtime.elapsed();
- //configs.writeLog(QString::number(sleeptime));
- pthread->dtsleep(sleeptime);
- }
- }
- if(havewrite>=prefile->len)
- {
- break;//完毕退出循环
- }
- if(!pwsocket->isValid ()) break;//判断连接是否断开
-
- }
[ 此贴被XChinux在2006-05-18 15:30重新编辑 ]