您的位置:首页 > 理论基础 > 计算机网络

http 断点续传

2010-05-19 17:05 169 查看

http 断点续传

原理:

1. 打开本地文件fopen,移动文件指针到文件尾fseek

2. 获得文件大小ftell, 格式化HTTP请求头 "Range: bytes=ftell -", 以偏移httpfile指针,实现断点续传

3. 获得要下载的文件,以二进制形式传输,OpenURL

4. 接收数据,防止阻塞PeekMessage

Sample:

char string[25];

CString StrFileName=m_lf;

CString StrUrl=m_url;

CString sheader;

long lStartPos =0;

//打开本地文件,m_lf 是文件路径,如:C:\\a.mp3

FILE *file=NULL;

file=fopen(m_lf,"ab");

if(file!=NULL)

{

//移动文件指针到文件尾

fseek(file,0,SEEK_END);

lStartPos=ftell(file);

itoa(lStartPos,string,10);

m_byte=string;

//格式化请求头,如: 从第 1000 个字节起开始下载:“Range: bytes=999 -”

sheader.Format(_T("%sRange: bytes=%d-\r\n"), szHeaders,lStartPos);

}

else

{

MessageBox("local file failed!");

return;

}

try{

CInternetSession s;

CHttpFile *hf=NULL;

//获得要下载的文件,以二进制形式传输

hf=(CHttpFile*)s.OpenURL(m_url,1,INTERNET_FLAG_TRANSFER_BINARY,sheader,-1 );

if(hf!=NULL)

{

//开始传输数据

byte *nbytes = new byte[512];

int nReadSize=0;

nReadSize=hf->Read(nbytes,512);

while( nReadSize >0)

{

   fwrite(nbytes,1,nReadSize,file);

   nReadSize=hf->Read(nbytes,512);

   lStartPos=ftell(file);

   itoa(lStartPos,string,10);

   m_byte=string;

//防止阻塞

   doenents();

}

fclose(file);

hf->Close();

delete hf;

}

}catch(CInternetException *p){

// hf=NULL;

p->Delete();

}

BOOL CGfDlg::doenents()

{

MSG msg;

while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))

{

if(!AfxGetApp()->PumpMessage())

{

::PostQuitMessage(0);

return false;

}

}

return true;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: