【原】apache ftpServer源码解读与收获(一)

一.FTP相关知识

FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动(积极)式和被动(消极)式。 

PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求, 服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT 命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的 XXXX端口发送连接请求,建立一条数据链路来传送数据。 

PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV 命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来传送数据。 

从上面可以看出,两种方式的命令链路连接方法是一样的,而数据链路的建立方法就完全不同。主动跟被动,关键在于是不是服务器建立了数据链路。如果是即主动(积极)模式,反之,则为被动(消极)模式。

 

FTP命令

命令划分

命令码

命令名称

备注

访问控制命令

USER

用户名

 
 

PASS

口令

此命令紧跟USER命令,在某些站点它是完成访问控制不可缺少的一步

 

ACCT

ACCOUNT 

 
 

CWD

改变工作目录

 
 

CDUP

回到上一层目录

 
 

SMNT

结构加载

此命令使用户在不改变登录或帐户信息的情况下加载另一个文件系统数据结构。传输参数也不变。参数是文件目录或与系统相关的文件集合

 

REIN

重新初始化

 
 

QUIT

退出登录

 

传输参数命令

PORT

数据端口

参数是要使用的数据连接端口

 

PASV

被动

此命令要求服务器DTP在指定的数据端口侦听,进入被动接收请求的状态,参数是主机和端口地址。

 

 

TYPE

表示类型

 
 

STRU

文件结构

F - 文件(非记录结构),它是默认值

R - 记录结构

P - 页结构

 

MODE

传输模式

S - 流(默认值)

B - 

C - 压缩

 

FTP服务命令

RETR

获得文件

使服务器DTP传送指定路径内的文件复本到服务器或用户DTP

 

STOR

保存

 
 

STOU

唯一保存

此命令和STOR差不多,此命令要求在此目录下的文件名是唯一的

 

APPE

附加

 
 

ALLO

分配

 
 

REST

重新开始

 
 

RNFR

重命名

 
 

RNTO

重命名为

此命令和上面的命令共同完成对文件的重命名。

 

 

ABOR

放弃

 
 

DELE

删除

 
 

RMD

删除目录

 
 

MKD

创建目录

 
 

PWD

打印工作目录

 
 

LIST

列表

如果路径指定一个目录或许多文件,返回指定路径下的文件列表。如果路径名指定一个文件,服务器返回文件的当前信息,参数为空表示用户当前的工作目录或默认目录

 

NLST

  
 

SITE

站点参数

服务器用来提供服务器系统信息

 

SYST

系统

确定服务器上运行的操作系统。

 

STAT

状态

返回控制连接状态

 

HELP

帮助

 
 

NOOP

等待

此命令不产生什么实际动作,它仅使服务器返回OK

 

有关FTP协议的详细,请阅读相关的RFC文档,这里不做赘述。

// FTPServer.h: interface for the CFTPServer class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_FTPSERVER_H__144E8B64_2004_4709_B55A_242FE5F07BD2__INCLUDED_) #define AFX_FTPSERVER_H__144E8B64_2004_4709_B55A_242FE5F07BD2__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "ConnectThread.h" #include "ListenSocket.h" #include "FTPEventSink.h" #include "UserManager.h" #include "SecurityManager.h" class CFTPServer : public CWnd { friend CConnectSocket; public: void SetGoodbyeMessage(LPCTSTR lpszText); void SetWelcomeMessage(LPCTSTR lpszText); void SetTimeout(int nValue); void SetPort(int nValue); void SetMaxUsers(int nValue); void SetStatisticsInterval(int nValue); BOOL IsActive(); void Stop(); BOOL Start(); CFTPServer(); virtual ~CFTPServer(); CUserManager m_UserManager; CSecurityManager m_SecurityManager; CCriticalSection m_CriticalSection; // list of thread pointers CTypedPtrList<CObList, CConnectThread*> m_ThreadList; int GetPort() { return m_nPort; }; int GetMaxUsers() { return m_nMaxUsers; } int GetTimeout() { return m_nTimeout; } int GetConnectionCount() { return m_nConnectionCount; } CString GetWelcomeMessage() { return m_strWelcomeMessage; }; CString GetGoodbyeMessage() { return m_strGoodbyeMessage; }; void AddTraceLine(int nType, LPCTSTR pstrFormat, ...); private: // socket member that listens for new connections CListenSocket m_ListenSocket; CFTPEventSink *m_pEventSink; int m_nPort; int m_nMaxUsers; CString m_strWelcomeMessage; CString m_strGoodbyeMessage; int m_nTimeout; BOOL m_bRunning; // statistics DWORD m_dwTotalReceivedBytes; DWORD m_dwTotalSentBytes; int m_nConnectionCount; int m_nTotalConnections; int m_nFilesDownloaded; int m_nFilesUploaded; int m_nFailedDownloads; int m_nFailedUploads; // Operations public: BOOL IsIPAddressAllowed(LPCTSTR lpszIPAddress); void SetSecurityMode(BOOL bBlockSpecific = TRUE); BOOL CheckMaxUsers(); void Initialize(CFTPEventSink *pEventSink); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CFTPServer) //}}AFX_VIRTUAL // Generated message map functions protected: int m_nSecurityMode; int m_nStatisticsInterval; //{{AFX_MSG(CFTPServer) afx_msg void OnTimer(UINT nIDEvent); //}}AFX_MSG LRESULT OnThreadClose(WPARAM wParam, LPARAM lParam); LRESULT OnThreadStart(WPARAM wParam, LPARAM); LRESULT OnThreadMessage(WPARAM wParam, LPARAM lParam); DECLARE_MESSAGE_MAP() }; #endif // !defined(AFX_FTPSERVER_H__144E8B64_2004_4709_B55A_242FE5F07BD2__INCLUDED_)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值