前面已经对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协议了。

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

Linux网络编程综合运用之MiniFtp实现(三)的更多相关文章

  1. Linux网络编程综合运用之MiniFtp实现(一)

    春节过后,万物复苏,在这元宵佳节的前一天,决定继续开启新年的学习计划,生命在于运动,提高源于学习,在经过漫长的Linux网络编程学习后,接下来会以一个综合的小项目来将所学的知识点综合运用,首先是对项目 ...

  2. Linux网络编程综合运用之MiniFtp实现(四)

    从今天开始,正式进入MiniFtp的代码编写阶段了,好兴奋,接下来很长一段时间会将整个实现过程从无到有一点点实现出来,达到综合应用的效果,话不多说正入正题: 这节主要是将基础代码框架搭建好,基于上节介 ...

  3. Linux网络编程综合运用之MiniFtp实现(九)

    上次中实现了FTP命令的映射来避免很多if....else的判断,这次主要是开始实现目录列表的传输,先看一下目前实现的: 数据连接创建好之后则开始进行目录列表的传输了,而要传输目录列表,首先要将目录列 ...

  4. Linux网络编程综合运用之MiniFtp实现(五)

    转眼兴奋的五一小长假就要到来了,在放假前夕还是需要保持一颗淡定的心,上次中已经对miniFTP有基础框架进行了搭建,这次继续进行往上加代码,这次主要还是将经历投射到handle_child()服务进程 ...

  5. Linux网络编程综合运用之MiniFtp实现(八)

    上节中实现了"USER"和"PASS"命令,如下: 事实上FTP是有很多命令组成的,如果就采用上面的这种方法来实现的话,就会有很多if...else if语句, ...

  6. Linux网络编程综合运用之MiniFtp实现(七)

    上节中实现了配置文件的解析,这节来实现用户登录的验证,首先用客户端来登录vsftpd来演示登录的过程: 接着再连接miniftpd,来看下目前的效果: 接下来实现它,与协议相关的模块都是在ftppro ...

  7. Linux网络编程综合运用之MiniFtp实现(六)

    间隔了一周时间没写了,由于今年的股势行情貌似不错的样子,对于对股市完全不懂的我也在蠢蠢欲动,所以最近一周业余时间在“不务正业”-----学习炒股.发现学习它其实挺费神的,满脑子都是走势图,而且是神经有 ...

  8. Linux网络编程学习(二) ----- 进程控制(第三章)

    1.进程和程序 程序是一个可执行文件,而一个进程是一个执行中的程序实例.一个进程对应于一个程序的执行,进程是动态的,程序是静态的,多个进程可以并发执行同一个程序.比如几个用户可以同时运行一个编辑程序, ...

  9. 【深入浅出Linux网络编程】 "开篇 -- 知其然,知其所以然"

    [深入浅出Linux网络编程]是一个连载博客,内容源于本人的工作经验,旨在给读者提供靠谱高效的学习途径,不必在零散的互联网资源中浪费精力,快速的掌握Linux网络编程. 连载包含4篇,会陆续编写发出, ...

随机推荐

  1. Intellij IDEA Debug 多模块下断点目标源问题

    Ctrl+Alt+S进入Settings,选择Debugger->show alternative source switcher 勾选,开启显示替代源选择器 由于项目工程存放了多个应用模块,包 ...

  2. 修改 ubuntu NTFS 文件系统下没有执行权限的问题

    由于NTFS本身的特殊性,不能对其分区的文件权限进行修改,无论是sudo还是root都没有用. 安装以下两个插件解决问题: sudo apt-get install ntfs-3g //这个12.04 ...

  3. lombok的@Accessors注解

    @AllArgsConstructor @Data @NoArgsConstructor @Accessors(chain = true) @EqualsAndHashCode public clas ...

  4. 【剑指offer】面试题 25. 合并两个排序的链表

    面试题 25. 合并两个排序的链表 NowCoder 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. Java 实现 ListNode Clas ...

  5. tp5 关键字模糊查询 日期查询 小于大于某范围等查询的优点

    挺不错,用熟了这tp5封装的很方便. 类似上边一个查询多个操作,基本在model 一个方法搞定代码也不用很多, 首先要学会用scope  网上搜tp scope 有几个例子可以借鉴 model 内添加 ...

  6. 稀疏数组(java实现)

    1.稀疏数组 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组. 稀疏数组的处理方法是: 1.1记录数组一共有几行几列,有多少个不同的值 1.2把具有不同值的元素的行列 ...

  7. 以php中的自增自自减运算符操作(整型,浮点型,字符串型,布尔型,空类型)数据

    // 环境 // // php版本 // PHP 7.0.33-0+deb9u1 (cli) (built: Dec 7 2018 11:36:49) ( NTS ) // Copyright (c) ...

  8. redis数据库——python使用和django中使用

    为什么要学redis 1.redis是内存 no-sql 数据库,相比mysql等硬盘数据库效率高 2.在内存值配置数据库使用,而不直接使用内存,redis存储的数据是可以管理的 3.memcache ...

  9. js 自定义加减乘除方法(防止js自身计算错误)

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  10. WebApi如何传递参数

    一 概述 一般地,我们在研究一个问题时,常规的思路是为该问题建模:我们在研究相似问题时,常规思路是找出这些问题的共性和异性.基于该思路,我们如何研究WebApi参数传递问题呢? 首先,从参数本身来说, ...