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协议了。

以上就是在正式编码前的一些理论了解。
Linux网络编程综合运用之MiniFtp实现(三)的更多相关文章
- Linux网络编程综合运用之MiniFtp实现(一)
春节过后,万物复苏,在这元宵佳节的前一天,决定继续开启新年的学习计划,生命在于运动,提高源于学习,在经过漫长的Linux网络编程学习后,接下来会以一个综合的小项目来将所学的知识点综合运用,首先是对项目 ...
- Linux网络编程综合运用之MiniFtp实现(四)
从今天开始,正式进入MiniFtp的代码编写阶段了,好兴奋,接下来很长一段时间会将整个实现过程从无到有一点点实现出来,达到综合应用的效果,话不多说正入正题: 这节主要是将基础代码框架搭建好,基于上节介 ...
- Linux网络编程综合运用之MiniFtp实现(九)
上次中实现了FTP命令的映射来避免很多if....else的判断,这次主要是开始实现目录列表的传输,先看一下目前实现的: 数据连接创建好之后则开始进行目录列表的传输了,而要传输目录列表,首先要将目录列 ...
- Linux网络编程综合运用之MiniFtp实现(五)
转眼兴奋的五一小长假就要到来了,在放假前夕还是需要保持一颗淡定的心,上次中已经对miniFTP有基础框架进行了搭建,这次继续进行往上加代码,这次主要还是将经历投射到handle_child()服务进程 ...
- Linux网络编程综合运用之MiniFtp实现(八)
上节中实现了"USER"和"PASS"命令,如下: 事实上FTP是有很多命令组成的,如果就采用上面的这种方法来实现的话,就会有很多if...else if语句, ...
- Linux网络编程综合运用之MiniFtp实现(七)
上节中实现了配置文件的解析,这节来实现用户登录的验证,首先用客户端来登录vsftpd来演示登录的过程: 接着再连接miniftpd,来看下目前的效果: 接下来实现它,与协议相关的模块都是在ftppro ...
- Linux网络编程综合运用之MiniFtp实现(六)
间隔了一周时间没写了,由于今年的股势行情貌似不错的样子,对于对股市完全不懂的我也在蠢蠢欲动,所以最近一周业余时间在“不务正业”-----学习炒股.发现学习它其实挺费神的,满脑子都是走势图,而且是神经有 ...
- Linux网络编程学习(二) ----- 进程控制(第三章)
1.进程和程序 程序是一个可执行文件,而一个进程是一个执行中的程序实例.一个进程对应于一个程序的执行,进程是动态的,程序是静态的,多个进程可以并发执行同一个程序.比如几个用户可以同时运行一个编辑程序, ...
- 【深入浅出Linux网络编程】 "开篇 -- 知其然,知其所以然"
[深入浅出Linux网络编程]是一个连载博客,内容源于本人的工作经验,旨在给读者提供靠谱高效的学习途径,不必在零散的互联网资源中浪费精力,快速的掌握Linux网络编程. 连载包含4篇,会陆续编写发出, ...
随机推荐
- Intellij IDEA Debug 多模块下断点目标源问题
Ctrl+Alt+S进入Settings,选择Debugger->show alternative source switcher 勾选,开启显示替代源选择器 由于项目工程存放了多个应用模块,包 ...
- 修改 ubuntu NTFS 文件系统下没有执行权限的问题
由于NTFS本身的特殊性,不能对其分区的文件权限进行修改,无论是sudo还是root都没有用. 安装以下两个插件解决问题: sudo apt-get install ntfs-3g //这个12.04 ...
- lombok的@Accessors注解
@AllArgsConstructor @Data @NoArgsConstructor @Accessors(chain = true) @EqualsAndHashCode public clas ...
- 【剑指offer】面试题 25. 合并两个排序的链表
面试题 25. 合并两个排序的链表 NowCoder 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. Java 实现 ListNode Clas ...
- tp5 关键字模糊查询 日期查询 小于大于某范围等查询的优点
挺不错,用熟了这tp5封装的很方便. 类似上边一个查询多个操作,基本在model 一个方法搞定代码也不用很多, 首先要学会用scope 网上搜tp scope 有几个例子可以借鉴 model 内添加 ...
- 稀疏数组(java实现)
1.稀疏数组 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组. 稀疏数组的处理方法是: 1.1记录数组一共有几行几列,有多少个不同的值 1.2把具有不同值的元素的行列 ...
- 以php中的自增自自减运算符操作(整型,浮点型,字符串型,布尔型,空类型)数据
// 环境 // // php版本 // PHP 7.0.33-0+deb9u1 (cli) (built: Dec 7 2018 11:36:49) ( NTS ) // Copyright (c) ...
- redis数据库——python使用和django中使用
为什么要学redis 1.redis是内存 no-sql 数据库,相比mysql等硬盘数据库效率高 2.在内存值配置数据库使用,而不直接使用内存,redis存储的数据是可以管理的 3.memcache ...
- js 自定义加减乘除方法(防止js自身计算错误)
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- WebApi如何传递参数
一 概述 一般地,我们在研究一个问题时,常规的思路是为该问题建模:我们在研究相似问题时,常规思路是找出这些问题的共性和异性.基于该思路,我们如何研究WebApi参数传递问题呢? 首先,从参数本身来说, ...