http 断点续传


原理:1. 打开本地文件fopen,移动文件指针到文件尾fseek2. 获得文件大小ftell, 格式化HTTP请求头 "Range: bytes=ftell -", 以偏移httpfile指针,实现断点续传3. 获得要下载的文件,以二进制形式传输,OpenURL4. 接收数据,防止阻塞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;}
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值