zoukankan      html  css  js  c++  java
  • http 断点续传

    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;
    }


  • 相关阅读:
    线程池和进程池
    初识数据库
    线程q
    event事件
    死锁和递归锁
    信号量
    PythonStudy——线程中的几种消息队列
    PythonStudy——GIL Global Interpreter Lock 全局解释器锁
    PythonStudy——异步回调
    PythonStudy——日志模块 logging
  • 原文地址:https://www.cnblogs.com/zzxap/p/2175789.html
Copyright © 2011-2022 走看看