FileZilla 源代码分析9
创始人
2024-07-21 11:51:22
0

FileZilla是一种快速、可信赖的FTP客户端以及服务器端开放源代码程式,具有多种特色、直觉的接口。本文就给大家分析下FileZilla的源代码。

  在进一步分析代码之前,先复习一下FTP协议,下图是FTP的结构图。

图1

 

  客户端和服务器是通过两个连接来进行通讯的:

  一个是控制连接,也就是传输些控制命令,客户端发出FTP命令,服务器给出应答,例如:USER,PASS命令等等。这个连接中,FTP服务器的端 口就是熟知的21端口,连接是由客户端发起的,例如:ftp 192.168.0.1。有一点注意,用户是通过“用户接口”来操作的,一般的用户接口是指cuteFTP这些FTP客户端,或者ftp.exe这种命令 行程序,用户在用户接口使用的是ftp命令,如ls, get, cd等,这些ftp命令并不是真正与FTP服务器交互的命令,这些ftp命令还需要由“用户协议解释器”翻译成真正的ftp协议命令,如USER, PASS,才能与服务器进行交互。

  一个是数据连接,即真正的文件传输是在这个连接上进行的。服务器端的数据连接端口是20,客户端的数据连接端口是随机生成的。数据连接只在传输文件 时存在,文件传完后,这个连接就断了,如果需要再次传送文件,会再次建立一个数据连接(客户端的端口是随机的,不一定是上次的那个)。数据连接的模式有两 种,一种是主动方式,一种是被动方式,两者的区别在于数据连接是由谁发起。

  我们来看一个典型的FTP交互过程,用的是windows的ftp.exe程序,先建立一个连接,然后ls看一下文件列表,用get命令下 载一个文件,***quit关闭。下面-d选项可以显示交互的细节,注意-->开头的行是ftp客户端发给FTP服务器的请求,3个数字开头的行是服 务器的应答,如220, 331等开头的行:

  C:\>ftp -d localhost

  Connected to dell.

  220-FileZilla Server version 0.9.18 beta

  220-written by Tim Kosse (Tim.Kosse@gmx.de)

  220 Please visit http://sourceforge.net/projects/filezilla/

  User (dell:(none)): robert

  ---> USER robert

  331 Password required for robert

  Password:

  ---> PASS test

  230 Logged on

  ftp> ls

  ---> PORT 127,0,0,1,4,173

  200 Port command successful

  ---> NLST

  150 Opening data channel for directory list.

  Manual.txt

  226 Transfer OK

  ftp: 收到 175 字节,用时 0.00Seconds 175000.00Kbytes/sec.

  ftp> get Manual.txt

  ---> PORT 127,0,0,1,4,174

  200 Port command successful

  ---> RETR Manual.txt

  150 Opening data channel for file transfer.

  226 Transfer OK

  ftp: 收到 17319 字节,用时 0.09Seconds 192.43Kbytes/sec.

  ftp> quit

  ---> QUIT

  221 Goodbye

  C:\>

  刚开始,客户端发出建立连接的请求:

  C:\>ftp -d localhost // 建立连接

  Connected to dell. // 连接已建立

  然后服务器发送欢迎信息,并要求输入用户名:

  220-FileZilla Server version 0.9.18 beta

  220-written by Tim Kosse (Tim.Kosse@gmx.de)

  220 Please visit http://sourceforge.net/projects/filezilla/

  User (dell:(none)):

  客户端输入用户名robert,然后回车:

  ---> USER robert // ftp.exe生成FTP命令:USER,发送给服务器

  服务器要求输入密码:

  331 Password required for robert

  Password:

  客户端输入密码,然后回车:

  ---> PASS test // ftp.exe生成FTP命令:PASS,发送给服务器

  服务器通过密码验证:

  230 Logged on

  客户端键入ls命令

  ftp> ls

  ftp.exe生成FTP命令:PORT,告诉服务器客户端的随机端口是什么

  ---> PORT 127,0,0,1,4,173 // 127,0,0,1是IP地址,4 * 256 + 173 = 1197是随机端口号

  200 Port command successful // 服务器响应PORT命令

  ---> NLST // 客户端发出NLST命令,要求列出文件列表

  150 Opening data channel for directory list. // 服务器会在20端口与客户端的1197端口建立数据连接,传输数据,注意ls命令的结果是在“数据连接”中传输的

  Manual.txt // 只有一个文件

  226 Transfer OK // FTP服务器响应,传输完毕

  ftp: 收到 175 字节,用时 0.00Seconds 175000.00Kbytes/sec. // FTP客户端显示的传输结果

  下面客户端要求下载Manual.txt文件

  ftp> get Manual.txt

  ---> PORT 127,0,0,1,4,174 // 告诉服务器客户端新的随机端口4 * 256 + 174 = 1198

  200 Port command successful // // 服务器响应PORT命令

  ---> RETR Manual.txt // 告诉服务器下载Manual.txt文件

  150 Opening data channel for file transfer. // 服务器会在20端口与客户端的1198端口建立数据连接,传输数据

  226 Transfer OK // FTP服务器响应,传输完毕

  ftp: 收到 17319 字节,用时 0.09Seconds 192.43Kbytes/sec. // FTP客户端显示的传输结果

  ***客户端退出

  ftp> quit

  ---> QUIT // 发出QUIT命令

  221 Goodbye // 服务器***响应

  仔细阅读上面的交互过程,可以发现,用户手工输入的一个FTP命令,可能会被ftp.exe处理成与FTP服务器的多次交互。如ls, get命令。

  要想详细了解FTP命令的细节,可以参见FTP的RFC,或者相关的资料,不过由于我们阅读源代码的主要目的不是研究FTP细节,而在于掌握高并发的网络编程的技术,所以,我们只以上面这个简单的FTP交互来看一下,在代码中这个过程是如何实现的

通过文章完整的描述,大家应该知道了FileZilla 源代码,希望对大家有帮助!

【编辑推荐】

  1. FileZilla简单介绍
  2. FileZilla 源代码分析1
  3. FileZilla 源代码分析2
  4. FileZilla 源代码分析3
  5. FileZilla 源代码分析4
  6. FileZilla 源代码分析5
  7. FileZilla 源代码分析6
  8. FileZilla 源代码分析7
  9. FileZilla 源代码分析8

 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...