在用多线程+CSocket来下载一些大型文件,文件的大小未知的情况下,应如何编程?
网上的很多例子显然是针对文件比较小的情况的,就只执行一次CAsyncSocket::Receive()就完事了;但如果文件较大时,显然要循环执行多次才行,但如何判断下载已经结束了呢?(由于事前无法得知文件大小,所以不能根据已下载的字节数来判断。)
我用了以下一段程序:
CSocket*pSocket;
......
while(TRUE)
{
int nCount=pSocket.Receive(szBuf,4096);
if(nCount>0)
file.Write(szBuf,nCount);
else
break;
}
MSDN中说:If the connection has been closed, it returns 0.
结果发现全部内容都下载回来后,程序仍未能break出这个循环。
请大家指出当中的错误所在!
网上的很多例子显然是针对文件比较小的情况的,就只执行一次CAsyncSocket::Receive()就完事了;但如果文件较大时,显然要循环执行多次才行,但如何判断下载已经结束了呢?(由于事前无法得知文件大小,所以不能根据已下载的字节数来判断。)
我用了以下一段程序:
CSocket*pSocket;
......
while(TRUE)
{
int nCount=pSocket.Receive(szBuf,4096);
if(nCount>0)
file.Write(szBuf,nCount);
else
break;
}
MSDN中说:If the connection has been closed, it returns 0.
结果发现全部内容都下载回来后,程序仍未能break出这个循环。
请大家指出当中的错误所在!
while(dataRecved<shouldRecv)
{
int nCount=pSocket.Receive(szBuf,4096);
if(nCount>0)
file.Write(szBuf,nCount);
else
break;
dataRecved+=nCount;
}
while(nCount=pSocket.Receive(szBuf,4096))
{
if(nCount>0)
{
file.Seek(dataRecved,CFile::begin);
file.Write(szBuf,nCount);
}
else
break;
dataRecved+=nCount;
}