zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    231. Power of Two
    204. Count Primes
    205. Isomorphic Strings
    203. Remove Linked List Elements
    179. Largest Number
    922. Sort Array By Parity II
    350. Intersection of Two Arrays II
    242. Valid Anagram
    164. Maximum Gap
    147. Insertion Sort List
  • 原文地址:https://www.cnblogs.com/rjjs/p/5638941.html
Copyright © 2011-2022 走看看