?? downloadmtr.h
字號:
// DownloadMTR.h: interface for the CDownloadMTR class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_DOWNLOADMTR_H__9249B71D_A5D7_4E0F_866E_92CD7B7A395A__INCLUDED_)
#define AFX_DOWNLOADMTR_H__9249B71D_A5D7_4E0F_866E_92CD7B7A395A__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//
// MTR - MultiThread Resume : 多線程斷點續傳
//
/****************************************************************************************************************
投稿說明:
****************************************************************************************************************/
#define NOTE_DownloadMTR \
" ◆◆◆ 《FTP、HTTP 多線程斷點續傳下載文件》◆◆◆\r\n\
FlashGet、網絡螞蟻想必大家都很熟悉,他們都是利用多線程同步下載的原理來提高下載速度,同時具有斷點續傳的功能,這些軟件\
到底是如何實現的呢?答案在代碼中揭曉。\r\n\
代碼中的 CDownloadMTR 類就是一個具有多線程斷點續傳功能的類,同時提供了測試例程。代碼中未使用任何CInet類或InternetOpen()\
等函數,而是直接使用 SOCKET 連接,一步一步解析HTTP/FTP通信協議來完成會話和文件下載,具體細節請參考源代碼,由于時間關系,代\
碼有點零亂,錯誤也在所難免,如有朋友發現我代碼中的錯誤,請來信告知,多謝!\r\n\
你可以任意修改復制本代碼,但請保留這段文字不要修改。\r\n\
希望我能為中國的軟件行業盡一份薄力!\r\n\
\r\n\
◆◆◆ 作者 ◆◆◆\r\n\
謝紅偉 · chrys · chrys@163.com · http://www.howa.com.cn\r\n\
\r\n\
◆◆◆ 日期 ◆◆◆\r\n\
2007-05-23 05:47:24\r\n"
#include "DownloadFtp.h"
#include "DownloadHttp.h"
#include <Afxmt.h>
#define DEFAULT_THREAD_COUNT 4 // 默認下載一個文件所用的線程數
#define MAX_DOWNLOAD_THREAD_COUNT 16 // 下載一個文件最大使用的線程數
//
// 單個對象的下載信息
//
typedef struct _downloadcellinfo
{
int nWillDownloadStartPos; // 要下載文件的開始位置
int nWillDownloadSize; // 本次需要下載的大小,-1表示一直下載到文件尾
DWORD nDownloadedSize; // 該線程已下載的大小
} t_DownloadCellInfo;
//
// 下載信息
//
typedef struct _DownloadInfo
{
DWORD dwThreadCount; // 該文件由多少個線程在下載
int nTotalDownloadedSize; // 該文件總共已經下載的字節數
} t_BaseDownInfo;
class CDownloadMTR
{
public:
int Get_TotalDownloadedSize();
int Get_FileTotaleSize();
static CString GetLocalFileNameByURL ( LPCTSTR lpszDownloadURL );
void StopDownload();
DWORD GetDownloadElapsedTime ();
BOOL Download (
LPCTSTR lpszDownloadURL,
LPCTSTR lpszSavePath,
LPCTSTR lpszSaveOnlyFileName,
LPCTSTR lpszUsername=NULL,
LPCTSTR lpszPassword=NULL,
BOOL bForceDownload=FALSE
);
BOOL SetThreadCount ( int nThreadCount );
CDownloadMTR();
virtual ~CDownloadMTR();
void Callback_SaveDownloadInfo ( int nIndex, int nDownloadedSize, int nSimpleSaveSize );
BOOL ThreadProc_DownloadMTR();
private:
int m_nTotalDownloadedSize_ThisTimes; // 表示這次啟動下載任務以來總共下載的字節數
CCriticalSection m_CSFor_DownloadedData;
void StandardSaveFileName ();
BOOL m_bForceDownload;
HANDLE m_hThread;
DWORD m_dwDownloadStartTime;
int GetDownloadInfoWholeSize();
int FindIndexByThreadHandle ( HANDLE hThread );
ENUM_DOWNLOAD_RESULT WaitForDownloadFinished ();
BOOL GetDownloadResult ();
BOOL AttemperDownloadTask ( int nIndex );
int GetUndownloadMaxBytes ( int &nUndownloadBytes );
BOOL HandleDownloadFinished ( ENUM_DOWNLOAD_RESULT eDownloadResult );
BOOL SaveDownloadInfo ();
BOOL AssignDownloadTask ();
BOOL DownloadInfoIsValid ();
BOOL ReadDownloadInfo ();
CString GetTempFilePath ();
int StartMTRDownload ();
void DeleteDownloadObjectAndDataMTR();
void DeleteDownloadObject_Info();
BOOL CreateDownloadObjectAndDataMTR ();
CDownloadPub* CreateDownloadObject ( int nCount=1 );
void DeleteDownloadObject ( CDownloadPub *pDownloadPub );
CString m_csSavePath, m_csSaveOnlyFileName, m_csSavePathFileName, m_csDownloadURL;
CString m_csProtocolType;
int m_nThreadCount; // 線程數
CDownloadPub *m_pDownloadPub_Info; // 取站點信息對象
CDownloadPub *m_pDownloadPub_MTR; // 多線程下載對象
t_BaseDownInfo m_BaseDownInfo; // 下載基本信息,線程數等
t_DownloadCellInfo *m_pDownloadCellInfo; // 各個下載對象的參數
// 模塊結束事件
HANDLE m_hEvtEndModule;
};
#endif // !defined(AFX_DOWNLOADMTR_H__9249B71D_A5D7_4E0F_866E_92CD7B7A395A__INCLUDED_)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -