SuperSocket应用之FTP源码解析

一 简述

 

  命令行协议是一种使用比较多的协议,其优点在于使用简单易于扩展性,同时也利于解析和使用。FTP,POP,SMTP等均采用命令行协议,其中FTP在早起互联网时期成为网络资源共享的主要方式,可见FTP协议之重要性。我想正是由于命令行协议的优势所以ss的默认协议就是它。

  对于FTP的详细介绍这里可以参考:http://www.cnblogs.com/luoxn28/p/5585458.html,或者其他博文。不管什么博文还是来看代码最能理解其工作机制和原理。

      另外FTP也常在计算机软件系统架构中担任文件服务器一职,提供文件上传下载服务,如图片

二 FTP服务器

  2.1 功能需求

    FTPServer作为服务器,首先应该提供用户管理功能,文件资源管理(类似于windows资源管理器),FTP命令以及文件传输,协议封装等主要职能

  2.2 用户管理

    这里可以连接windows系统用户也可以预定义相关用户并以配置文件或者其他方式存储,FTP有匿名和非匿名用户登录认证,这取决于FTP服务的安全性和共享性,对于匿名用户来说该用户是共享且开放的,对于非匿名用户可以通过权限来控制文件的访问与管理。

  2.3 资源管理

  文件资源管理类似于windows资源管理器,只是这里管理的对象是文件而已,所谓文件管理主要包括,查询,查看,创建,删除,修改,其中查询文件列表链接到递归知识。

  2.4 FTP命令

    SS已封装好命令基类,所以这里只需按照FTP协议的命令进行相应命令类定义

  2.5 文件传输

    FTP文件传输有主被动之分,所谓的主被动针对客户端来说,主动模式下,用户发送上传或者下载文件服务命令,同时在发送的命令参数中携带客户端主动打开的端口告诉给服务器,在服务器接收到该信息并尝试与该端口建立连接并传输文件流,反之亦然。FTP提供文件传输通道的建立与关闭。

  2.6 协议封装

     FTP命令均是字符串,且确定,所以SS采用字符串资源管理器来封装FTP命令,对于服务器来说直接使用相关字符串资源命令收发消息即可

三 通信过程

 

3.1 登陆

  登陆过程:客户端会发送PASS命令,携带用户名密码等验证信息给服务端,当然这是针对非匿名的FTP,在接收到的参数中进行用户授权验证,将验证结果返回客户端;

3.2 执行命令

     命令的执行贯穿整个客户端服务端会话周期,如LIST命令,ABORT等等。

3.3 文件传输

  3.3.1  主动模式

    首先客户端发起文件传输命令如下载,上传,PORT,STOR、命令,携带客户端主动打开的客户端断开默认为20端口,此断开默认在防火墙内部不被过滤掉,服务器收到该命令向客户端发送接收ok命令,且尝试向客户端地址和断开发起连接,建立二进制文件流传输通道,代码详看PORT命令和STOR命令

   3.3.2 被动模式

    首先还是客户端向服务器发起上传或者下载命令请求,服务端开启随机端口名发送给客户端,客户端与服务器建立数据传输通道,开启文件传输

 DataConnection:数据连接通道类,该类主要负责传输通道维护工作,提供通道建立,文件传输,关闭等方法

 

  3.3.3 通道关闭

  通道关闭的原因有3:会话关闭,传输完成,传输异常,通道的关闭实为关闭Socket,当然这是在被动模式下由服务端开启的端口,这样也就起到回收的作用。

 1 public virtual void Close()
 2         {
 3             StopListener();
 4 
 5             if (Client != null && !m_IsClosed)
 6             {
 7                 try
 8                 {
 9                     Client.Shutdown(SocketShutdown.Both);
10                 }
11                 catch (Exception e)
12                 {
13                     m_Session.Logger.Error(e);
14                 }
15 
16                 try
17                 {
18                     Client.Close();
19                 }
20                 catch (Exception e)
21                 {
22                     m_Session.Logger.Error(e);
23                 }
24                 finally
25                 {
26                     Client = null;
27                     m_Session = null;
28                     m_IsClosed = true;
29                     OnClose();
30                 }
31             }
32         }
View Code

 

posted @ 2016-07-03 21:54  cuit_igis  阅读(2033)  评论(0编辑  收藏  举报