DownloadMTR.h
上传用户:oadesign
上传日期:2013-12-25
资源大小:265k
文件大小:4k
源码类别:

进程与线程

开发平台:

Visual C++

  1. // DownloadMTR.h: interface for the CDownloadMTR class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_DOWNLOADMTR_H__9249B71D_A5D7_4E0F_866E_92CD7B7A395A__INCLUDED_)
  5. #define AFX_DOWNLOADMTR_H__9249B71D_A5D7_4E0F_866E_92CD7B7A395A__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. //
  10. // MTR - MultiThread Resume : 多线程断点续传
  11. //
  12. /****************************************************************************************************************
  13. 投稿说明:
  14. ****************************************************************************************************************/
  15. #define NOTE_DownloadMTR 
  16. " ◆◆◆ 《FTP、HTTP 多线程断点续传下载文件》◆◆◆rn
  17. FlashGet、网络蚂蚁想必大家都很熟悉,他们都是利用多线程同步下载的原理来提高下载速度,同时具有断点续传的功能,这些软件
  18. 到底是如何实现的呢?答案在代码中揭晓。rn
  19. 代码中的 CDownloadMTR 类就是一个具有多线程断点续传功能的类,同时提供了测试例程。代码中未使用任何CInet类或InternetOpen()
  20. 等函数,而是直接使用 SOCKET 连接,一步一步解析HTTP/FTP通信协议来完成会话和文件下载,具体细节请参考源代码,由于时间关系,代
  21. 码有点零乱,错误也在所难免,如有朋友发现我代码中的错误,请来信告知,多谢!rn
  22. 你可以任意修改复制本代码,但请保留这段文字不要修改。rn
  23. 希望我能为中国的软件行业尽一份薄力!rn
  24. rn
  25. ◆◆◆ 作者 ◆◆◆rn
  26.     谢红伟 · chrys · chrys@163.com · http://www.howa.com.cnrn
  27. rn
  28. ◆◆◆ 日期 ◆◆◆rn
  29.     2007-05-23 05:47:24rn"
  30. #include "DownloadFtp.h"
  31. #include "DownloadHttp.h"
  32. #include <Afxmt.h>
  33. #define DEFAULT_THREAD_COUNT 4 // 默认下载一个文件所用的线程数
  34. #define MAX_DOWNLOAD_THREAD_COUNT 16 // 下载一个文件最大使用的线程数
  35. //
  36. // 单个对象的下载信息
  37. //
  38. typedef struct _downloadcellinfo
  39. {
  40. int nWillDownloadStartPos; // 要下载文件的开始位置
  41. int nWillDownloadSize; // 本次需要下载的大小,-1表示一直下载到文件尾
  42. DWORD nDownloadedSize; // 该线程已下载的大小
  43. } t_DownloadCellInfo;
  44. //
  45. // 下载信息
  46. //
  47. typedef struct _DownloadInfo
  48. {
  49. DWORD dwThreadCount; // 该文件由多少个线程在下载
  50. int nTotalDownloadedSize; // 该文件总共已经下载的字节数
  51. } t_BaseDownInfo;
  52. class CDownloadMTR  
  53. {
  54. public:
  55. int Get_TotalDownloadedSize();
  56. int Get_FileTotaleSize();
  57. static CString GetLocalFileNameByURL ( LPCTSTR lpszDownloadURL );
  58. void StopDownload();
  59. DWORD GetDownloadElapsedTime ();
  60. BOOL Download (
  61. LPCTSTR lpszDownloadURL,
  62. LPCTSTR lpszSavePath,
  63. LPCTSTR lpszSaveOnlyFileName,
  64. LPCTSTR lpszUsername=NULL,
  65. LPCTSTR lpszPassword=NULL,
  66. BOOL bForceDownload=FALSE
  67. );
  68. BOOL SetThreadCount ( int nThreadCount );
  69. CDownloadMTR();
  70. virtual ~CDownloadMTR();
  71. void Callback_SaveDownloadInfo ( int nIndex, int nDownloadedSize, int nSimpleSaveSize );
  72. BOOL ThreadProc_DownloadMTR();
  73. private:
  74. int m_nTotalDownloadedSize_ThisTimes; // 表示这次启动下载任务以来总共下载的字节数
  75. CCriticalSection m_CSFor_DownloadedData;
  76. void StandardSaveFileName ();
  77. BOOL m_bForceDownload;
  78. HANDLE m_hThread;
  79. DWORD m_dwDownloadStartTime;
  80. int GetDownloadInfoWholeSize();
  81. int FindIndexByThreadHandle ( HANDLE hThread );
  82. ENUM_DOWNLOAD_RESULT WaitForDownloadFinished ();
  83. BOOL GetDownloadResult ();
  84. BOOL AttemperDownloadTask ( int nIndex );
  85. int GetUndownloadMaxBytes ( int &nUndownloadBytes );
  86. BOOL HandleDownloadFinished ( ENUM_DOWNLOAD_RESULT eDownloadResult );
  87. BOOL SaveDownloadInfo ();
  88. BOOL AssignDownloadTask ();
  89. BOOL DownloadInfoIsValid ();
  90. BOOL ReadDownloadInfo ();
  91. CString GetTempFilePath ();
  92. int StartMTRDownload ();
  93. void DeleteDownloadObjectAndDataMTR();
  94. void DeleteDownloadObject_Info();
  95. BOOL CreateDownloadObjectAndDataMTR ();
  96. CDownloadPub* CreateDownloadObject ( int nCount=1 );
  97. void DeleteDownloadObject ( CDownloadPub *pDownloadPub );
  98. CString m_csSavePath, m_csSaveOnlyFileName, m_csSavePathFileName, m_csDownloadURL;
  99. CString m_csProtocolType;
  100. int m_nThreadCount; // 线程数
  101. CDownloadPub *m_pDownloadPub_Info; // 取站点信息对象
  102. CDownloadPub *m_pDownloadPub_MTR; // 多线程下载对象
  103. t_BaseDownInfo m_BaseDownInfo; // 下载基本信息,线程数等
  104. t_DownloadCellInfo *m_pDownloadCellInfo; // 各个下载对象的参数
  105. // 模块结束事件
  106. HANDLE m_hEvtEndModule;
  107. };
  108. #endif // !defined(AFX_DOWNLOADMTR_H__9249B71D_A5D7_4E0F_866E_92CD7B7A395A__INCLUDED_)