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
  • 相关阅读:
    递归神经网络 RNN 原理(上)
    递归神经网络
    队列-Python 实现
    Tableau 我常用函数整理
    代码重构(OOP)-小栗子(PyQt5)
    Python基础
    Excel 数据显示到网页
    采坑
    Python基础
    JavaScript一些对象。
  • 原文地址:https://www.cnblogs.com/rjjs/p/5638941.html
Copyright © 2011-2022 走看看