ftpdownload.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:7k
源码类别:

模拟服务器

开发平台:

C/C++

  1. // FtpDownload.h: interface for the CFtpDownload class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_FTPDOWNLOAD_H__0866041E_80F8_4547_A298_A5B387FC77CB__INCLUDED_)
  5. #define AFX_FTPDOWNLOAD_H__0866041E_80F8_4547_A298_A5B387FC77CB__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. #include "BufSocket.h"
  10. // 常量定义
  11. // 下载结果
  12. const int FTP_RESULT_SUCCESS = 0; // 成功
  13. const int FTP_RESULT_SAMEAS = 1; // 要下载的文件已经存在并且与远程文件一致,不用下载
  14. const int FTP_RESULT_STOP = 2; // 中途停止(用户中断)
  15. const int FTP_RESULT_FAIL = 3; // 下载失败
  16. // 消息
  17. const WPARAM MSG_FTPDOWNLOAD_NETWORK = (WPARAM)33;
  18. const WPARAM MSG_FTPDOWNLOAD_STATUS = (WPARAM)34;
  19. const WPARAM MSG_FTPDOWNLOAD_RESULT = (WPARAM)35;
  20. const WPARAM MSG_FTPDOWNLOAD_MAX = (WPARAM)64; //保留最大可供扩充
  21. //下载状态
  22. const int FTP_STATUS_FILENAME = 1;
  23. const int FTP_STATUS_FILESIZE = 2;
  24. const int FTP_STATUS_FILEDOWNLOADEDSIZE = 3;
  25. /*
  26. const int FTP_STATUS_ERRORCOUNT = 4;
  27. const int FTP_STATUS_ERRORCODE = 5;
  28. const int FTP_STATUS_ERRORSTRING = 6;
  29. */
  30. // 重试类别
  31. const int  FTP_RETRY_NONE = 0;
  32. const int  FTP_RETRY_TIMES = 1;
  33. const int  FTP_RETRY_ALWAYS = 2;
  34. const int  DEFAULT_FTP_RETRY_MAX = 10; //缺省的重试次数
  35. // PROXY的类型
  36. const int FTP_PROXY_NONE = 0;
  37. const int FTP_PROXY_SOCKS4 = 1;
  38. const int FTP_PROXY_SOCKS4A = 2;
  39. const int FTP_PROXY_SOCKS5 = 3;
  40. //For use IE proxy setting
  41. //  Added by Linsuyi
  42. //  2001/02/01  01:20
  43. const int       FTP_PROXY_USEIE         = 4;
  44. // 缺省端口号
  45. static const int   DEFAULT_FTP_PORT= 21;
  46. // 缺省超时参数
  47. static const DWORD FTP_CONN_TIMEOUT = 120*1000;// 120秒
  48. static const DWORD FTP_SEND_TIMEOUT = 120*1000;// 120秒
  49. static const DWORD FTP_RECV_TIMEOUT = 120*1000;// 120秒
  50. // 发送请求
  51. static const int FTP_REQUEST_SUCCESS = 0; // 成功
  52. static const int FTP_REQUEST_ERROR = 1; // 一般网络错误,可以重试
  53. static const int FTP_REQUEST_STOP = 2; // 中途停止(用户中断) (不用重试)
  54. static const int FTP_REQUEST_FAIL = 3; // 失败 (不用重试)  
  55. // FTP命令
  56. static const char FTP_CMD_USER[] = _T("USER");
  57. static const char FTP_CMD_PASS[] = _T("PASS");
  58. static const char FTP_CMD_ACCT[] = _T("ACCT");
  59. static const char FTP_CMD_QUIT[] = _T("QUIT");
  60. static const char FTP_CMD_PORT[] = _T("PORT");
  61. static const char FTP_CMD_PASV[] = _T("PASV");
  62. static const char FTP_CMD_TYPE[] = _T("TYPE");
  63. static const char FTP_CMD_RETR[] = _T("RETR");
  64. static const char FTP_CMD_REST[] = _T("REST");
  65. static const char FTP_CMD_LIST[] = _T("LIST");
  66. static const char FTP_CMD_STAT[] = _T("STAT");
  67. static const char FTP_CMD_SITE[] = _T("SITE");
  68. static const char FTP_CMD_ABOR[] = _T("ABOR");
  69. static const char FTP_CMD_SIZE[] = _T("SIZE");
  70. #pragma pack(push, 1)
  71. // 结构定义
  72. typedef struct _tagFtpDownloadStatus
  73. {
  74. int nStatusType;
  75. DWORD dwFileSize;
  76. DWORD dwFileDownloadedSize;
  77. CString strFileName;
  78. /*
  79. int nErrorCount;
  80. CString strError;
  81. DWORD dwErrorCode;
  82. */
  83. } FTPDOWNLOADSTATUS,*PFTPDOWNLOADSTATUS;
  84. #pragma pack(pop)
  85. class CFtpDownload  
  86. {
  87. public:
  88.     CFtpDownload();
  89.     virtual ~CFtpDownload();
  90.     
  91. public:
  92.     BOOL IsUserStop();
  93.     void SetPasv(BOOL bPasv = TRUE);
  94.     void SetAuthorization(LPCTSTR lpszUsername,LPCTSTR lpszPassword,BOOL bAuthorization = TRUE );
  95.     void SetProxy(LPCTSTR lpszProxyServer,int nProxyPort,BOOL bProxy=TRUE,BOOL bProxyAuthorization = FALSE,LPCTSTR lpszProxyUsername = NULL,LPCTSTR lpszProxyPassword = NULL,int nProxyType = FTP_PROXY_NONE);
  96.     void SetTimeout(DWORD dwSendTimeout,DWORD dwRecvTimeout,DWORD dwConnTimeout);
  97.     void SetRetry(int nRetryType,int nRetryDelay=0,int nRetryMax = 0);
  98.     void SetNotifyWnd(HWND hNotifyWnd,int nNotifyMsg,BOOL bNotify = TRUE );
  99.     void StopDownload();
  100.     int  Download(LPCTSTR lpszDownloadUrl,LPCTSTR lpszSavePath = NULL,BOOL bForceDownload = FALSE);
  101.     
  102. private:
  103.     BOOL    GetIEProxy(CString &strProxyServer, int &nProxyPort, int &nProxyType);
  104.     BOOL    SendCommand(LPCTSTR lpszCmd,LPCTSTR lpszParameter);
  105.     BOOL    GetDataReply(CString& strReply);
  106.     BOOL    GetInfo(LPCTSTR lpszReply,DWORD& dwSize,CTime& TimeLastModified);
  107.     BOOL    GetPasvIP(LPCTSTR lpszReply,CString& strPasvIP,int& nPasvPort);
  108.     BOOL    GetReplyCode(LPCTSTR lpszResponse,DWORD& dwReplyCode,BOOL& bMultiLine);
  109.     BOOL    GetReply(CString& strReply,DWORD& dwReplyCode);
  110.     int     SendRequest(BOOL bPasv = TRUE);
  111.     BOOL    CreateControlSocket();
  112.     void    CloseControlSocket();
  113.     BOOL    CreateDataSocket( SOCKET hSocket = INVALID_SOCKET );
  114.     void    CloseDataSocket();
  115.     BOOL    ParseURL(LPCTSTR lpszURL,CString& strServer,CString& strObject,int& nPort);
  116.     void    GetFileName();
  117.     CTime   GetTime(LPCTSTR lpszTime);
  118.     int     MakeConnection(CBufSocket* pBufSocket,CString strServer,int nPort,BOOL bBind = FALSE ,LPDWORD lpdwIP = NULL,LPINT lpnPort = NULL);
  119.     
  120. private:
  121.     // 待下载URL和本地保存路径
  122.     CString m_strDownloadUrl;
  123.     CString m_strSavePath;   // 可以是全路径或保存目录
  124.     CString m_strTempSavePath;//临时文件的路径
  125.     
  126.     // 停止下载
  127.     BOOL m_bStopDownload;
  128.     HANDLE m_hStopEvent;
  129.     
  130.     // 强制重新下载(不管已有的文件是否与远程文件相同)
  131.     BOOL m_bForceDownload;
  132.     
  133.     // 文件日期(远程文件的信息)
  134.     CTime m_TimeLastModified;
  135.     
  136.     // 是否支持断点续传
  137.     BOOL m_bSupportResume;
  138.     
  139.     // 是否使用PASV方式
  140.     BOOL m_bPasv;
  141.     
  142.     // 文件以及下载大小
  143.     DWORD m_dwFileSize; // 文件总的大小
  144.     DWORD m_dwFileDownloadedSize; // 文件总共已经下载的大小
  145.     
  146.     DWORD m_dwDownloadSize; // 本次需要下载的大小
  147.     DWORD m_dwDownloadedSize; // 本次已经下载的大小
  148.     
  149.     
  150.     // 超时TIMEOUT 连接超时、发送超时、接收超时(单位:毫秒)
  151.     DWORD m_dwConnTimeout;
  152.     DWORD m_dwRecvTimeout;
  153.     DWORD m_dwSendTimeout;
  154.     
  155.     // 重试机制
  156.     int m_nRetryType; //重试类型(0:不重试 1:重试一定次数 2:总是重试)
  157.     int m_nRetryTimes; //重试次数
  158.     int m_nRetryDelay; //重试延迟(单位:毫秒)
  159.     int m_nRetryMax;    //重试的最大次数
  160.     
  161.     // 错误处理
  162.     int m_nErrorCount; //错误次数 (暂时没有作用)
  163.     CString m_strError; //错误信息 (暂时没有作用)
  164.     
  165.     
  166.     // 向其他窗口发送消息
  167.     BOOL m_bNotify; // 是否向外发送通知消息
  168.     HWND m_hNotifyWnd; // 被通知的窗口
  169.     int m_nNotifyMessage; // 被通知的消息
  170.     
  171.     // 是否使用代理 
  172.     BOOL m_bProxy;
  173.     CString m_strProxyServer;
  174.     int m_nProxyPort;
  175.     int m_nProxyType;
  176.     
  177.     // 代理是否需要验证
  178.     BOOL m_bProxyAuthorization;
  179.     CString m_strProxyUsername;
  180.     CString m_strProxyPassword;
  181.     
  182.     // FTP用户和口令
  183.     BOOL m_bAuthorization;
  184.     CString m_strUsername;
  185.     CString m_strPassword;
  186.     
  187.     
  188.     // 下载过程中所用的变量
  189.     CString m_strServer;
  190.     CString m_strObject;
  191.     CString m_strFileName;
  192.     int m_nPort;
  193.     
  194.     CBufSocket m_cControlSocket; // 控制连接的SOCKET
  195.     CBufSocket m_cDataSocket; // 数据连接的SOCKET
  196. };
  197. #endif // !defined(AFX_FTPDOWNLOAD_H__0866041E_80F8_4547_A298_A5B387FC77CB__INCLUDED_)