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

📄 hftpclient.h

📁 积下的一点C++编程序库源码
💻 H
字号:
// HFtpClient.h: interface for the HFtpClient class.
//
//////////////////////////////////////////////////////////////////////


//文件名		: HFtpClient.h

//功能			: 对FTP协议的简单封装

//创建			: 2004.4.22

//修改日期		:

//作者			: 韩国静
//

#if !defined(AFX_HFTPCLIENT_H__98353B25_7122_445A_83B0_2D3CD20AF2B2__INCLUDED_)
#define AFX_HFTPCLIENT_H__98353B25_7122_445A_83B0_2D3CD20AF2B2__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "HTcpSock.h"

/*		
	1、服务端在端口21监听控制连接
	2、数据连接由两种方法建立:客户端建立监听PORT给服务端或用PASV请求服务端监听
	3、命令以“\r\n”为结束;应答以三位数字开始,若是多行第一行数字之后跟'-',最后一行以数字开始。
*/


class HFtpClient  
{
	int m_RemainLen;
	char m_szReturn[512];

	UNI_WORD m_wPort;			//监听端口
	CHTcpSock m_Control;		//控制连接
	CHTcpSock m_Listener;		//数据连接监听

	int recvLine(char *pLine, int len,UNI_DWORD ns);

	//从服务器接收一个应答
	UNI_BOOL GetAckString(char *pLine, int len,UNI_DWORD ns);
public:
	//文件类型,用于TYPE命令
	typedef enum {
		TYPE_ASCII		=	'A',
		TYPE_IMAGE		=	'I',
		TYPE_TELNET		=	'T',
		TYPE_EBCDIC		=	'E',
	}HFTP_TYPE;

	//数据组织,用于STRU命令
	typedef enum{
		STRU_FILE		=	'F',
		STRU_PAGE		=	'P',
		STRU_RECORD		=	'R',
	}HFTP_STRU;

	//传输方式,用于MODE命令
	typedef enum{
		MODE_STREAM		=	'S',
		MODE_BLOCK		=	'B',
		MODE_COMPRESS	=	'C',
	}HFTP_MODE;
	
public:
	
	//清除控制连接中的未接收字符
	void ReInitializeControl();

	//释放数据连接,
	UNI_BOOL DestroySock(CHTcpSock *sock,char *recvBuf,int bufLen,UNI_DWORD ns=10000);

	CHTcpSock* Stor(char *fileName, char *pAckBuf, int bufLen, UNI_DWORD ns=10000)
	{
		return GetDataFromListener("STOR ",fileName,pAckBuf,bufLen,ns);
	}
	CHTcpSock * Stor(UNI_DWORD dwIP,UNI_WORD wPort,char *fileName,char *pAckBuf,int bufLen,UNI_DWORD ns=10000)
	{
		return GetDataFromIP_Port(dwIP,wPort,"STOR ",fileName,pAckBuf,bufLen,ns);
	}
	CHTcpSock * List(char *szDir, char *pAckBuf, int bufLen, UNI_DWORD ns=10000)
	{
		return GetDataFromListener("LIST ",szDir,pAckBuf,bufLen,ns);
	}
	CHTcpSock * List(UNI_DWORD dwIP,UNI_WORD wPort,char *szDir,char *pAckBuf,int bufLen,UNI_DWORD ns=10000)
	{
		return GetDataFromIP_Port(dwIP,wPort,"LIST ",szDir,pAckBuf,bufLen,ns);
	}	
	CHTcpSock * Retr(char *fileName,char *pAckBuf,int bufLen,UNI_DWORD ns=10000)
	{
		return GetDataFromListener("RETR ",fileName,pAckBuf,bufLen,ns);
	}
	CHTcpSock * Retr(UNI_DWORD dwIP,UNI_WORD wPort,char *fileName,char *pAckBuf,int bufLen,UNI_DWORD ns=10000)
	{
		return GetDataFromIP_Port(dwIP,wPort,"RETR ",fileName,pAckBuf,bufLen,ns);
	}


	//不需要数据连接的命令

	UNI_BOOL Mode(HFTP_MODE mode,char *pAckBuf, int bufLen, UNI_DWORD ns=10000);
	UNI_BOOL Stru(HFTP_STRU stru,char *pAckBuf, int bufLen, UNI_DWORD ns=10000);
	UNI_BOOL Type(HFTP_TYPE type,char *pAckBuf, int bufLen, UNI_DWORD ns=10000);

	UNI_BOOL Pass(char *passWord,char *pAckBuf,int bufLen,UNI_DWORD ns=10000);
	UNI_BOOL User(char *userName,char *pAckBuf,int bufLen,UNI_DWORD ns=10000);	
	UNI_BOOL Acct(char *acct, char *pAckBuf, int bufLen, UNI_DWORD ns=10000);

	UNI_BOOL Rmd(char *szDir, char *pAckBuf, int bufLen, UNI_DWORD ns=10000);
	UNI_BOOL Pwd(char *pAckBuf, int bufLen, UNI_DWORD ns=10000);
	UNI_BOOL CWD(char *szDir,char *pAckBuf,int bufLen,UNI_DWORD ns=10000);
	UNI_BOOL Mkd(char *szDir, char *pAckBuf, int bufLen, UNI_DWORD ns=10000);
	UNI_BOOL Dele(char *fileName, char *pAckBuf, int bufLen, UNI_DWORD ns=10000);

	UNI_BOOL Cdup(char *pAckBuf, int bufLen, UNI_DWORD ns=10000);
	UNI_BOOL Abor(char *pAckBuf, int bufLen, UNI_DWORD ns=10000);
	UNI_BOOL Quit(char *pAckBuf, int bufLen, UNI_DWORD ns=10000);
	UNI_BOOL Rein(char *pAckBuf, int bufLen, UNI_DWORD ns=10000);
	UNI_BOOL Port(char *pAckBuf, int bufLen, UNI_DWORD ns=10000);
	UNI_DWORD Pasv(UNI_WORD &wPort,char *pAckBuf, int bufLen, UNI_DWORD ns=10000);

	
	//完整的LIST命令操作,分别对应用PORT建立连接和用PASV建立连接,可做数据传输的例子程序
	int Port_ls(char *szDir,char *recvBuf,int bufLen,UNI_DWORD ns=10000);
	int Pasv_ls(char *szDir,char *recvBuf,int bufLen,UNI_DWORD ns=10000);
	
	
	
	//建立与服务器的连接
	UNI_BOOL Open(UNI_DWORD dwIp, UNI_WORD wPost,char *pAckBuf,int bufLen,UNI_DWORD ns=10000);
	UNI_BOOL Open(char *szUrl, UNI_WORD wPost,char *pAckBuf,int bufLen,UNI_DWORD ns=10000)
	{
		UNI_DWORD dwIp;
		hostent *p;
		if(p=gethostbyname(szUrl))
		{
			dwIp=*((DWORD *)p->h_addr_list[0]);
			return Open(dwIp,wPost,pAckBuf,bufLen,ns);
		}
		return UNI_FALSE;
	}
	//建立监听端口及在Windows下初始化SOCKET动态链接库;
	UNI_BOOL Initialize(UNI_WORD wPort,int nMaxList=1);
	void UnInitialize();
	
	//构造与析构
	HFtpClient();
	virtual ~HFtpClient();

protected:

	//对应PORT与PASV两种方式建立与服务端的数据连接,这两个是辅助函数供其它需要数据连接的命令调用
	CHTcpSock* GetDataFromIP_Port(UNI_DWORD dwIP,UNI_WORD wPort,char *command,char *agr,char *pAckBuf,int bufLen,UNI_DWORD ns);
	CHTcpSock * GetDataFromListener(char *command,char *fileName, char *pAckBuf, int bufLen, UNI_DWORD ns);
};

#endif // !defined(AFX_HFTPCLIENT_H__98353B25_7122_445A_83B0_2D3CD20AF2B2__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -