用以下代码实现发送文件并在进度条上显示发送进度
====================================================
char buffer[BUFFERSIZE];
DWORD dwFileSizeSend = 0; //已发送数据的大小
DWORD dwRead; //读出的数据大小
BOOL fRead;
int length;
int nProgressPos;
for(;;)
{
fRead = ReadFile(hFile,buffer,sizeof(buffer),&dwRead,NULL);
if(!fRead) //读失败
{
AfxMessageBox("send读文件失败");
closesocket(sock);
CloseHandle(hFile);
return -1;
}
if(dwRead == 0) //文件结束
break;
dwFileSizeSend = dwFileSizeSend + dwRead;
nProgressPos = (int)(dwFileSizeSend * 100 / myFileInfo.dwFileSize);
gpControlProgressSendFile->SetPos(nProgressPos);
length=send(sock,buffer,dwRead,0);
if(length<=0)
{
break;
}
}
===================================
发送一个40M的文件时进度条显示正常,
发送一个100M的文件时进度条走到约1/3后又返回到0,接着走,又到1/3,循环直到结束。
弄了半天不大明白,请教!另外我传送文本文件正常,传送rm格式的电影就只能播放开头的一点,
然后就不能放了。[在本机上用127.0.0.1接受则播放正常!],
不知是什么原因阿!

解决方案 »

  1.   

    进度条返回的原因可能是乘以100后超过大小
    DWORD 是 32 位的值,所以可以表示 0 ~ 4294967295
    100M = 100 * 1024 * 1024 = 104857600
    所以 100M * 100 = 10485760000 > 4294967295
    你应该
    nProgressPos = (int)(dwFileSizeSend * 100.0 / myFileInfo.dwFileSize)
                                           \__> 100 改成 100.0
    就可以了
      

  2.   

    DWORD * 100 为整数,超过 32 位表示范围
    而 100.0 是双精度数,所以 dwFileSizeSend * 100.0 的结果是双精度数这里你还犯了一个错误
    记住 整数除以整数结果还是整数double a = 4 / 3;
    结果应该是 1.0 而不是 1.3333。