DownloadMTR.h
上传用户:oadesign
上传日期:2013-12-25
资源大小:265k
文件大小:4k
- // 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 多线程断点续传下载文件》◆◆◆rn
- FlashGet、网络蚂蚁想必大家都很熟悉,他们都是利用多线程同步下载的原理来提高下载速度,同时具有断点续传的功能,这些软件
- 到底是如何实现的呢?答案在代码中揭晓。rn
- 代码中的 CDownloadMTR 类就是一个具有多线程断点续传功能的类,同时提供了测试例程。代码中未使用任何CInet类或InternetOpen()
- 等函数,而是直接使用 SOCKET 连接,一步一步解析HTTP/FTP通信协议来完成会话和文件下载,具体细节请参考源代码,由于时间关系,代
- 码有点零乱,错误也在所难免,如有朋友发现我代码中的错误,请来信告知,多谢!rn
- 你可以任意修改复制本代码,但请保留这段文字不要修改。rn
- 希望我能为中国的软件行业尽一份薄力!rn
- rn
- ◆◆◆ 作者 ◆◆◆rn
- 谢红伟 · chrys · chrys@163.com · http://www.howa.com.cnrn
- rn
- ◆◆◆ 日期 ◆◆◆rn
- 2007-05-23 05:47:24rn"
- #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_)