zoukankan      html  css  js  c++  java
  • Linux网络编程综合运用之MiniFtp实现(三)

    前面已经对FTP相关的一些概念有了基本的认识,接下来就要进入代码编写阶段了,也是非常兴奋的阶段,在开启这个它之前先对项目需求进行一个梳理,对其我们要实现的FTP服务器是一个什么样子。

    ftp命令列表

    要实现FTP服务器,首先要实现的就一些标准的FTP命令,这些命令如下:

    命令类型

    命令

    功能说明

    访问控制命令

    USER

    服务器上的用户名。

    PASS

    用户口令。

    CWD或XCWD

    改变工作目录。

    CDUP或XCUP

    回到上一层目录(父目录)

    QUIT

    退出

    ACCT

    暂不实现

    SMNT

    暂不实现

    REIN

    暂不实现

    传输参数命令

    PORT

    数据端口,主要向服务器发送客户数据连接的端口,格式为PORT h1,h2,h3,h4,p1,p2,其中32位的IP地址用h1,h2,h3,h4表示,16位的TCP端口号用 p1,p2表示。

    PASV

    此命令要求服务器数据传输进程在随机端口上监听,进入被动接收请求的状态。

    TYPE

    文件类型,可指定ASCII码,二进制等。

    STRU

    文件结构

    MODE

    传输模式

    服务命令

    RETR

    获得文件

    STOR

    保存文件,向服务器传输文件。如果文件已存在,原文件将被覆盖,如果文件不存在,则新建文件。

    APPE

    与STOR功能类似,但如果文件在指定路径已存在,则把数据附加到原文件尾部,如果不存在,则新建一个文件。

    LIST

    列目录详细清单

    NLST

    列出名字列表

    REST

    重新开始,参数代表服务器要重新开始的那一点,它并不传送文件,而是略过指定点前的数据,此命令后应该跟其他要求文件传输的FTP命令。

    ABOR

    异常终止。此命令通知服务中止以前的FTP命令和与之相关的数据传输。如果先前的操作已完成,则没有动作,返回226;如果没有完成,返回225。

    PWD或XPWD

    打印当前目录

    MKD或XMKD

    新建目录

    RMD或XRMD

    删除目录

    DELE

    删除文件

    RNFR,RNTO

    重命名

    SITE CHMOD

    修改权限

    SYST

    获取系统信息

    FEAT

    服务器特性

    SIZE

    获得文件大小

    STAT

    返回服务器状态

    NOOP

    该命令不指定任何动作,只是要求服务器返回OK响应。

    HELP

    帮助

    STOU

    暂不实现

    ALLO

    暂不实现

    【说明】:其中标红的是最重要的几个命令,它们有一个共同特点:都是通过数据连接通道完成的, 因而这几个命令之前需要传输一个PORT或PASV命令。具体命令之后会一一实现。

    接下来看一下FTP的一些其它功能:

    参数配置

     我们要将程序中的开关做成可配置的,这里可以看一下VSFTP的配置文件:

    空闲断开

    下面来看一下效果:

    默认情况下,空闲超时时间是300S,下面为了看到效果将其改小:

    保存并重启VSFTP服务:

    这时再看下空闲状态效果:

    可见过了5秒空闲连接就断开了,这时进程也结束了:

    限速

    也就是上传跟下载文件的限速功能,下面也来演示一下,默认情况下是没有限速的:

    这时对其进行限速配置:

    这时再上传:

    其速度传输过程序中会慢慢降到100K的样子。

    连接数限制

     这里包含两个方面的限制:总连接数的限制,针对所有IP来说的、同一个IP连接数的限制,下面来进行配置:

    重启FTP服务器,然后看下效果,由于LeapFTP2.7.6没有分页的功能,所以测这个需要用新一点的版本来演示,这里改用LeapFTP3.0.1

    接下来配置同一个IP的连接数的限制:

    然后来看下效果:

    断点续载与断点续传

    下面还是回到低版的LeapFTP2.7.6,因为高版本的没有abort命令,下面来演示下:

    上传了一小部分之后,则开始断开连接,这时再次连接,然后再次上传该文件:

    从中可以发现此时的“续传”按钮是灰色不可用的,原因是需要对其进行一下配置,如下:

    这时就可以续传了:

    另外续传还有一种方式:APPE,如下:

    以上是对FTP服务器实现的需求,下面来从系统设计的角度来分析下:

    当成功连接一个客户端时,这时可以看到创建了两个进程:

    可见该FTP服务器是采用多进程的方式来实现的,为什么不用多线程的方式呢?

    对于FTP服务器来讲,多线程的方式是绝对不可取的,因为:

    那为什么连接一个客户端要创建两个进程呢?先看一下系统逻辑结构:

     从中可以发现,服务进程是直接跟客户端进行通讯,而nobody进程并没有,它仅仅是跟服务进程通信,来协助服务进程来建立数据连接通道,以及需要一些特珠权限的控制,比如服务进程建立了连接之后,假设是PORT模式,由于是服务器端主动连接客户端,服务器端需要绑定20端口来连接客户端,而服务进程是没有权限来绑定20端口的,也就意味着没办法正常建立数据连接通道,所以需要加入nobody进程。而nobody和服务进程是采用内部通信的协议,这个协议对外是不可见的,完全可以由我们自己来定义,所以可以用UNIX域协议来进行通讯,而不用TCP/IP协议了。

    以上就是在正式编码前的一些理论了解。

  • 相关阅读:
    最小点割集
    哈希链表形式
    poj 1809
    整数的分拆
    Dynamic Rankings
    Error on line 1 of document
    怎么样用JAVA取得系统的路径?
    Richfaces优化,Richfaces为何这么慢?
    null Nested exception: null
    帮助你生成组织结构图的jQuery插件 jOrgChart java程序员
  • 原文地址:https://www.cnblogs.com/webor2006/p/4427533.html
Copyright © 2011-2022 走看看