http 断点续传

本文介绍了一种基于HTTP协议的断点续传技术实现方案。通过使用fopen、fseek和ftell等函数操作本地文件,并利用OpenURL发送带有Range头部的HTTP请求来实现文件的分段下载。该方案还提供了防止UI阻塞的方法。
原理:
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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值