📄 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; // 该文件由多少个线程在下载
} 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 + -