📄 hftpclient.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 + -