⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 downloadmtr.h

📁 多线程下载的
💻 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;				// 该文件由多少个线程在下载
} t_BaseDownInfo;

class CDownloadMTR  
{
public:
	int Get_TotalDownloadedSize_ThisTimes ();
	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 + -