青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

使用 CInternetSession 封裝多線程 http 文件下載

使用 CInternetSession 封裝多線程 http 文件下載

作者:付黎
www.crazy-bit.com

源代碼下載
/*

URLDownloadToFile();

主要是下載升級包..............................

*/
  如何下載一個http文件?我們當然可以用socket自己實現(xiàn)http協(xié)議去做,但費時費力還易出bug,對于一個客戶端程序穩(wěn)定易維護是第一位的,所幸MS給我們提供了功能強大的internet API函數(shù)族,MFC的CInternetSession對它們進行了一些簡單的封裝,但如此簡單的封裝對我等拿來主義者來說只是個半成品。必須經(jīng)過再加工才能食用。

先來介紹一下CInternetSession的使用:

下面的代碼是讀取鏈接的基本方法:

// CInternetSession在遇到一些錯誤時會拋出異常,因此必須包起來
TRY
{
      CInternetSession     sess ;

      
// 統(tǒng)一以二進制方式下載
      DWORD         dwFlag = INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_RELOAD ;
      CHttpFile     
* pF = (CHttpFile*)sess.OpenURL(strFilename, 1, dwFlag); ASSERT(pF);
      
if (!pF)
          
{AfxThrowInternetException(1);}

      
// 得到文件大小
      CString        str ;
      pF
->QueryInfo (HTTP_QUERY_CONTENT_LENGTH, str) ;
      
int     nFileSize = _ttoi(str) ;

      
char     * p = new[nFileSize] ;
      
while (true)
      
{
          
// 每次下載8Kb
          int     n = pF->Read (p, (nFileSize < 8192? nFileSize : 8192) ;
          
if (n <= 0)
              
break ;
          p 
+= n ; nFileSize -= n ;
      }

      delete[] p ;
      delete pF ;
}

CATCH_ALL(e) 
{}
END_CATCH_ALL
  這段代碼有一個問題,在獲取文件大小這個地方,對于靜態(tài)網(wǎng)頁 HTTP_QUERY_CONTENT_LENGTH 查詢會返回文件大小,但對于asp,php這樣的動態(tài)網(wǎng)頁,查詢會返回0。必須通過不斷的調(diào)用 CHttpFile::GetLength 來一點一點累加內(nèi)容,就像這樣:
int     n = pF->GetLength() ;
while (n)
{
      
int     * p = new BYTE[n] ;
      pF
->Read (p, n) ;
      delete[] p ;
      n 
= pF->GetLength() ;
}


不過網(wǎng)絡斷線同樣會讓 GetLength 返回0,必須把這種情況屏蔽掉。 
if (n == 0)
{
      DWORD     dw ;
      
if (::InternetQueryDataAvailable ((HINTERNET)(*pF), &dw, 00&& (dw == 0))
      
{
          
// 到這里就代表文件下載成功了
      }

}


   OK,我們已經(jīng)把機制摸清了,剩下就是把這些體力活全扔進線程里,又一個麻煩產(chǎn)生了:線程里如何向外界通知事件(開始下載,下載完成之類)呢?直接調(diào)用回調(diào)函數(shù)當然可以,但這時回調(diào)函數(shù)是置于我們的線程中,造成在回調(diào)函數(shù)中對資源的訪問必須非常小心,防止多線程沖突。下一步,加鎖同步...。
掙扎在多線程泥潭中的人已經(jīng)夠多的了,其實我們有一個更安全方便的方法,借助 SendMessage 把線程里的事件發(fā)送到窗口線程統(tǒng)一處理,windows會幫我們把所有消息排隊執(zhí)行,相當于把多線程程序轉成了單線程^_^ (我一個同事把此類用于包含數(shù)百個線程的爬蟲程序中,非常穩(wěn)定)

封裝結果及使用:
template<class T>
class FCDownloadFileWndBase : public T
{
public:
      
// 默認構造函數(shù)
      FCDownloadFileWndBase () {}
      
// CDialog 構造函數(shù)
      FCDownloadFileWndBase (UINT nID, CWnd* pParent) : T(nID, pParent) {}
      
// CFormView 構造函數(shù)
      FCDownloadFileWndBase (UINT nID) : T(nID) {}

      
// 創(chuàng)建一個線程下載文件URL,如果URL正在下載中,此函數(shù)什么也不做立即返回
      void DownloadFile (LPCTSTR strFileURL, int nPriority=THREAD_PRIORITY_IDLE) ;

protected:
      
// 檢查鏈接最后修改時間,有些服務器會禁止查看時間,strTime為空
      
// 用戶必須重載實現(xiàn)本接口,返回TRUE則繼續(xù)下載文件,返回FALSE則不再下載文件
      virtual BOOL DownloadFile_OnCheckTime (CString strFileURL, CString strTime) =0 ;

      
// 當鏈接成功下載完成后會調(diào)用此接口
      virtual void DownloadFile_OnFinished (CString strFileURL, char* pBuffer, int nLength) {}

      
// 當IE設置代理服務器并且服務器需要帳號認證時候回調(diào)
      virtual void DownloadFile_OnProxyValidate (CString strFileURL, CString& strUsername, CString& strPassword) {}

      
// 出現(xiàn)錯誤時回調(diào)
      virtual void DownloadFile_OnError (CString strFileURL) {}

      
// 開始下載一個鏈接
      virtual void DownloadFile_OnStartDownload (CString strFileURL) {}

      
// 當前進度,每下載一塊數(shù)據(jù)就會回調(diào)
      virtual void DownloadFile_OnProgress (CString strFileURL, int nNow, int nTotal) {}
}
;
使用起來非常簡單,讓你的窗口從它派生,然后選擇你感興趣的事件重載之即可。

幾點說明:

  1. 本類會自動使用IE里的連接設置,如果代理服務器需要帳號驗證,會回調(diào) DownloadFile_OnProxyValidate 讓用戶輸入帳號密碼;
  2. 因為使用了模版,所以不支持MFC丑陋的dynamic機制:-( ,請把 DECLARE_DYNAMIC 和 IMPLEMENT_DYNAMIC 宏從你的類中移除。如果你需要運行時類型檢查,可以用C++的RTTI機制dynamic_cast/typeid;

download article source from here:Download.rar

posted on 2007-10-15 16:57 楊粼波 閱讀(848) 評論(1)  編輯 收藏 引用

評論

# re: 使用 CInternetSession 封裝多線程 http 文件下載[未登錄] 2007-10-17 22:54 wen

thanks for you tech
i can't download sample ,
please check it  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久手机精品视频| 久久综合久久综合久久综合| 久久综合国产精品| 国产精品国产a级| 99re6这里只有精品视频在线观看| 米奇777超碰欧美日韩亚洲| 亚洲激情一区二区| 久久一日本道色综合久久| 国产亚洲福利社区一区| 国产综合精品一区| 欧美在线视频在线播放完整版免费观看 | 浪潮色综合久久天堂| 亚洲欧美一区二区精品久久久| 欧美日韩亚洲一区二区三区在线观看 | 久久久一区二区| 午夜亚洲视频| 一区二区三区在线视频播放| 欧美一区二区三区在线播放| 欧美一二三视频| 亚洲综合日韩| 国产精品视频网| 欧美在线播放高清精品| 欧美中文字幕在线视频| 亚洲电影有码| 亚洲精品三级| 国产麻豆9l精品三级站| 亚洲一区二区在| 欧美在线观看你懂的| 在线成人小视频| 久久久精品999| 免费不卡在线观看| 亚洲午夜国产成人av电影男同| 中文精品一区二区三区| 欧美亚洲成人网| 久久一区视频| 欧美日韩天堂| 久久香蕉国产线看观看网| 欧美国产日韩精品免费观看| 亚洲女人天堂av| 久久午夜电影网| 国产精品99久久久久久久女警| 亚洲在线不卡| 国产精品免费网站在线观看| 欧美专区在线观看| 欧美日韩色婷婷| 欧美国产成人在线| 国产真实乱子伦精品视频| 一片黄亚洲嫩模| 亚洲精品国产精品久久清纯直播| 影音先锋在线一区| 亚洲电影网站| 国内一区二区三区| 午夜伦欧美伦电影理论片| 一区二区三区欧美在线观看| 男男成人高潮片免费网站| 久久久91精品国产| 国产精品亚洲аv天堂网| 日韩视频中文字幕| 99在线精品视频| 你懂的网址国产 欧美| 久久综合电影| 揄拍成人国产精品视频| 久久国产精品第一页| 久久都是精品| 国产午夜精品久久久| 午夜欧美理论片| 久久精品人人爽| 国产在线欧美日韩| 久久精品一区二区| 免费观看在线综合色| 亚洲第一偷拍| 欧美成人有码| 最新成人在线| 亚洲一区二区三区精品动漫| 欧美日韩伊人| 亚洲午夜国产成人av电影男同| 亚洲图片在区色| 国产精品区免费视频| 欧美亚洲一区二区三区| 久久影院午夜片一区| 亚洲成人在线视频网站| 欧美好骚综合网| 99www免费人成精品| 国产日韩欧美高清| 欧美一区二区三区视频| 蜜臀av一级做a爰片久久| 亚洲国产精品久久久| 欧美日韩二区三区| 亚洲欧美日韩国产中文| 快she精品国产999| 艳女tv在线观看国产一区| 国产精品初高中精品久久| 欧美在线网址| 亚洲国产成人精品久久久国产成人一区| 91久久久久久| 国产精品亚洲第一区在线暖暖韩国| 欧美在线视频观看| 91久久国产自产拍夜夜嗨 | 欧美日韩一区二区三区视频| 亚洲线精品一区二区三区八戒| 久久av一区二区| 91久久精品久久国产性色也91 | 亚洲欧美三级伦理| 女主播福利一区| 亚洲女女做受ⅹxx高潮| 在线不卡中文字幕| 国产精品日韩欧美大师| 久久一区二区精品| 在线亚洲伦理| 免费在线观看精品| 亚洲欧美日韩国产中文| 亚洲高清久久久| 国产欧美日韩在线视频| 欧美啪啪一区| 久久一区二区三区国产精品| 亚洲伦伦在线| 欧美高清视频一区二区| 欧美一区二区三区免费大片| 欧美一级视频免费在线观看| 欧美顶级艳妇交换群宴| 亚洲精选在线| 韩日欧美一区二区| 国产精品视屏| 欧美日韩国产一级片| 美女被久久久| 久久精品国产99精品国产亚洲性色| aa级大片欧美| 亚洲黄色免费电影| 美女尤物久久精品| 久久成人精品| 久久aⅴ国产欧美74aaa| 亚洲女女女同性video| 99re66热这里只有精品3直播| 黄色在线成人| 欲色影视综合吧| 国产自产女人91一区在线观看| 国产精品久久久久久久一区探花| 欧美人交a欧美精品| 欧美大片一区二区| 欧美电影资源| 欧美精品久久久久久久久久| 免费精品99久久国产综合精品| 久久久免费观看视频| 久久精品亚洲国产奇米99| 欧美一区国产二区| 久久都是精品| 久久中文字幕一区二区三区| 久久精品免费播放| 久久嫩草精品久久久久| 久久偷窥视频| 欧美激情一区在线观看| 欧美激情在线| 国产精品视频不卡| 国产精品永久免费观看| 国产一区二区欧美| 精品成人久久| 日韩视频精品在线| 99国产精品国产精品久久| 亚洲少妇在线| 欧美一区二区三区四区高清 | 欧美一级专区| 久久久999精品| 欧美大片专区| 亚洲毛片网站| 新狼窝色av性久久久久久| 久久精品女人| 欧美福利电影网| 国产精品久久久久久久久久直播| 国产欧美不卡| 亚洲人成啪啪网站| 亚洲一区影音先锋| 久久最新视频| 亚洲三级性片| 久久成人av少妇免费| 欧美国产日韩一区二区| 国产精品日本欧美一区二区三区| 韩国一区电影| 亚洲一区二区三区精品动漫| 久久视频在线免费观看| 亚洲理论电影网| 欧美在线资源| 欧美日韩成人在线播放| 国产日韩视频一区二区三区| 亚洲经典在线| 欧美一级欧美一级在线播放| 欧美国产精品久久| 亚洲一区二区高清| 欧美a一区二区| 国产欧美日韩| 在线视频你懂得一区| 免费观看一区| 久久不射2019中文字幕| 欧美日本在线播放| 国产专区欧美精品| 午夜视频久久久| 日韩小视频在线观看| 久久免费偷拍视频| 国产自产2019最新不卡| 西瓜成人精品人成网站| 国产伦精品一区二区三区视频孕妇 |