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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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>
            久久99在线观看| 亚洲第一精品夜夜躁人人躁 | 久久成人免费视频| 午夜精品视频在线观看| 欧美一级理论片| 久久国产福利国产秒拍| 久久一区二区三区四区| 免费观看亚洲视频大全| 欧美激情视频一区二区三区在线播放| 欧美电影免费| 国产精品日本| 在线观看日韩av| 一本久道久久综合中文字幕| 一区二区三区日韩精品| 午夜亚洲福利在线老司机| 久久久精品999| 欧美大片免费| 在线综合亚洲| 久久一区二区精品| 国产精品久久久久久久久果冻传媒| 国产欧美精品一区| 亚洲日韩视频| 久久aⅴ国产欧美74aaa| 最近中文字幕mv在线一区二区三区四区| 夜夜夜精品看看| 蜜桃久久av一区| 国产精品久久国产三级国电话系列| 国产一区二区视频在线观看 | 午夜视黄欧洲亚洲| 久久综合图片| 国产精品久久久久aaaa| 亚洲福利一区| 久久国产精品久久精品国产| 亚洲激情国产| 久久久久www| 国产精品成人播放| 亚洲国产日韩在线| 欧美伊人影院| 亚洲美女中文字幕| 免费黄网站欧美| 国产一区亚洲| 性欧美video另类hd性玩具| 亚洲精品1区| 蜜桃av一区二区| 激情欧美日韩一区| 欧美一区二区精品久久911| 99re热这里只有精品免费视频| 久久先锋资源| …久久精品99久久香蕉国产| 久久黄色小说| 先锋影音国产精品| 国产精品亚洲片夜色在线| 99www免费人成精品| 亚洲高清一区二区三区| 久久夜色精品亚洲噜噜国产mv | 久久综合狠狠综合久久综合88| 欧美性天天影院| 一区二区国产在线观看| 亚洲精品久久久一区二区三区| 免费在线国产精品| 亚洲激情黄色| 亚洲日韩第九十九页| 欧美成人免费全部| 亚洲激情视频| 91久久综合| 欧美三区在线| 亚洲在线观看视频网站| 亚洲一区二区三区中文字幕在线 | 亚洲欧美在线另类| 国产精品性做久久久久久| 欧美一区2区视频在线观看| 99视频精品全部免费在线| 欧美日韩国产天堂| 亚洲永久免费观看| 亚洲你懂的在线视频| 国产日韩欧美夫妻视频在线观看| 羞羞色国产精品| 欧美一区二区三区免费视频| 国内精品一区二区三区| 欧美大成色www永久网站婷| 欧美精品久久久久a| 亚洲天堂av电影| 亚洲国产岛国毛片在线| 影音先锋亚洲一区| 欧美高清不卡| 欧美日韩国产麻豆| 欧美一区二区国产| 久久躁狠狠躁夜夜爽| 亚洲免费av电影| 亚洲午夜高清视频| 在线观看亚洲视频| 一本色道久久| 一区二区在线观看视频在线观看| 亚洲第一久久影院| 国产精品v欧美精品v日韩| 久久久www成人免费无遮挡大片 | 久久精品夜色噜噜亚洲a∨ | 久久婷婷国产综合精品青草| 亚洲精品一区二区网址| 亚洲一级电影| 亚洲激情视频网站| 亚洲欧美日韩国产中文在线| 亚洲成色www8888| 亚洲视频在线视频| ●精品国产综合乱码久久久久 | 久久免费99精品久久久久久| 亚洲美女视频在线免费观看| 欧美一区二区三区电影在线观看| 亚洲人永久免费| 欧美一级淫片aaaaaaa视频| 日韩小视频在线观看专区| 久久精品视频va| 午夜精品剧场| 欧美片在线观看| 欧美91视频| 国产亚洲永久域名| 洋洋av久久久久久久一区| 亚洲国产一区二区三区高清| 午夜国产精品影院在线观看| 亚洲精品在线三区| 麻豆精品传媒视频| 久久久久国产精品厨房| 欧美色视频在线| 亚洲精品激情| 亚洲美女尤物影院| 久久综合伊人| 美日韩精品视频免费看| 国内精品福利| 欧美中日韩免费视频| 欧美在线观看视频在线| 国产精品成人免费精品自在线观看| 亚洲国产精品99久久久久久久久| 黄色一区二区三区四区| 欧美一区二视频| 久久精品国产一区二区三区免费看| 国产精品久久久久久久7电影| 99在线视频精品| 亚洲私人影院| 国产精品一区2区| 亚洲欧美日本国产专区一区| 亚洲欧美日本国产有色| 国产精品女主播在线观看| 亚洲一区二区三区国产| 欧美 日韩 国产在线| 欧美激情第4页| 亚洲啪啪91| 99视频精品免费观看| 欧美电影在线观看| 亚洲国产综合91精品麻豆| 亚洲精品美女在线| 欧美精品国产| 99精品国产高清一区二区| 亚洲一二三四久久| 国产精品久久久久久久久久免费看| 亚洲网站视频| 欧美一级淫片aaaaaaa视频| 国产日产精品一区二区三区四区的观看方式 | 亚洲国产另类 国产精品国产免费| 亚洲国产日本| 欧美日韩成人综合在线一区二区| av不卡免费看| 久久久精品午夜少妇| 亚洲国产精品黑人久久久| 欧美成人影音| 亚洲欧美国产77777| 久久九九免费视频| 亚洲国产精品尤物yw在线观看| 欧美电影免费观看高清完整版| 99精品久久| 久久精品五月| 亚洲免费高清| 国模叶桐国产精品一区| 欧美日本高清一区| 久久xxxx| 夜夜嗨av一区二区三区四季av| 久久久精品国产免大香伊| 亚洲毛片一区| 黄色成人免费网站| 欧美视频免费在线| 久久综合国产精品台湾中文娱乐网| 日韩一级黄色片| 免费视频最近日韩| 欧美一级专区免费大片| 日韩视频久久| 激情成人综合网| 国产精品久久久久影院亚瑟| 另类av一区二区| 亚洲男女毛片无遮挡| 亚洲黄色性网站| 看片网站欧美日韩| 欧美一区二粉嫩精品国产一线天| 亚洲人成网站777色婷婷| 国产精品视频区| 欧美视频一区在线观看| 欧美电影打屁股sp| 美女视频黄 久久| 久久精品女人的天堂av| 亚洲欧美资源在线| 亚洲欧美国产毛片在线| 夜夜嗨av一区二区三区中文字幕 |