最新消息:

FileZilla 源代码分析1-2

编程 eben 58浏览 0评论

FileZilla 源代码分析1

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

FileZilla是开源的FTP服务器,用C++写的,通过分析它的源代码,可以掌握C++网络编程以及高并发服务器的设计。

FileZilla是http://sourceforge.net上的项目,主页是http://sourceforge.net/projects/filezilla,我们要研究的版本是:FileZilla Server 0_9_18,其实FileZilla还包括客户端软件。

下载后安装,安装时选择安装source,即安装了源代码。

安装完成后,可以直接打开工程自带的FileZilla server.sln,这个是vs 2003.net工程,里面有三个project,

FZS Interface:这个是FTP服务器的设置以及监控界面

Service:这个是核心的FTP服务器部分

GFtp:打不开,不知是干什么用的,老外也会如此马虎? 🙂

直接编译是会出错,主要是FileZilla需要依赖两个第三方包:zlib(压缩算法包)以及regexp(正则表达式的包)

先搞定zlib,下载http://www.winimage.com/zLibDll/zlib123.zip

解开,生成目录zlib123,用.net 2003打开zlib123\projects\visualc6\zlib.dsw

打开 生成|配置管理器,设置活动的解决方案配置为:DLL Release,编译生成项目zlib,成功后会在目录Win32_DLL_Release下生成zlib1.lib和zlib1.dll

然后,regexp用到了boost第三方包,这里面有很多公用的C++组件,下载地址:

http://internap.dl.sourceforge.net/sourceforge/boost/boost_1_33_1.zip

解开后,在cmd下,

***步:需要编译bjm,这是编译boost的编译器,晕

cd boost_1_33_1\tools\build\jam_src

build.bat

在当前的bin.ntx86目录下,生成了bjam.exe文件。

第二步:编译boost

cd boost_1_33_1

将刚才生成的bjam.exe拷过来

set VC7_ROOT=”C:\Program Files\Microsoft Visual Studio.NET 2003\Vc7″

bjam “-sTOOLS=vc7” install

这个步骤需要很久时间,其时我们只用了里面的regexp包,应该可以只编译这个包,但我没细研究。

编译完成后即在C盘根目录下生成了boost目录,这个目录下面.net工程要用到。

在.net工程里,工具|选项|项目|VC++目录,添加

可执行文件:zlib123\projects\visualc6\Win32_DLL_Release

包含文件:zlib123目录以及c:\Boost\include\boost-1_33_1

库文件:zlib123\projects\visualc6\Win32_DLL_Release以及c:\Boost\lib

这时FZS Interface工程应该可以编译成功了,编译完成后会在Debug目录生成FileZilla Server Interface.exe。

生成Service工程时,需要调整一下工程设置:

语言设置:打开工程属性页,配置属性|常规,选择字符集为“使用 Unicode 字符集”,否则编译时会出错unicode必须使用;

链接设置:打开工程属性页,配置属性|链接器,将输入zlib.lib改成zlib1.lib(因为zlib123工程生成的是zlib1.lib)

下面生成一下,应该可以了。在生成Service工程完成时已经自动安装了”FileZilla Server FTP server”服务,也可以手工安装服务:

cd FileZilla_Server\Debug

“FileZilla server.exe” install auto

可以试一下这个FTP服务器了,运行FileZilla_Server\interface\Debug\FileZilla Server Interface.exe,这是FTP服务器的配置监控程序,试着加几个user,设置home dir,再用FTP客户端连接一下试试,应该可以了。

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

FileZilla FTP服务器源代码分析(2)

FileZilla FTP服务器源代码分析:FileZilla是一款免费而且开源的FTP工具。包括FileZilla Client,FileZilla Server两个版本。FileZilla Server只提供了windows系统下的版本,我们要将本地的网站网页文件上传到网站服务器,或从服务器下载网页文件,只需FileZilla Client客户端版本就可以了。FileZilla FTP服务器源代码分。在进一步分析代码之前,先复习一下FTP协议,下图是FTP的结构图。

FileZilla 源代码分析1-2-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:\>

刚开始,客户端发出建立连接的请求:
1.C:\>ftp -d localhost // 建立连接  2. 3.Connected to dell. // 连接已建立  4. 然后服务器发送欢迎信息,并要求输入用户名:
1.220-FileZilla Server version 0.9.18 beta  2. 3.220-written by Tim Kosse (Tim.Kosse@gmx.de)  4. 5.220 Please visit http://sourceforge.net/projects/filezilla/  6. 7.User (dell:(none)):  8. 客户端输入用户名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-2

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址