FileZilla客户端实现分析

上传人:简****9 文档编号:109954682 上传时间:2019-10-28 格式:PDF 页数:7 大小:380.49KB
返回 下载 相关 举报
FileZilla客户端实现分析_第1页
第1页 / 共7页
FileZilla客户端实现分析_第2页
第2页 / 共7页
FileZilla客户端实现分析_第3页
第3页 / 共7页
FileZilla客户端实现分析_第4页
第4页 / 共7页
FileZilla客户端实现分析_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《FileZilla客户端实现分析》由会员分享,可在线阅读,更多相关《FileZilla客户端实现分析(7页珍藏版)》请在金锄头文库上搜索。

1、FileZilla 客户端实现分析FileZilla 客户端实现分析 FileZilla Client Analysis By David.Zhu 2005/8/2 Content List:Content List: Source File Classification Main Framework of FileZilla Client Network Implementation Analysis Get Nuggets from Misc Explore FileZilla Client GUI Knowledge Repository Summarize Reference 1.1

2、Source File Classification Kernel CommandQueue.cpp FileZilla.cpp FileZillaApi.cpp FtpListResult.cpp MainThread.cpp SiteManager.cpp Definition 在 CAysncSocketLayer 和 CAsyncSocketEx 之间还有 一个 Callback 机制,CAsyncSocketExLayer:DoLayerCallback 把消息封装成 t_callbackMsg,调用 CAsyncSocketEx:AddCallbackNotification 添加

3、到 CAsyncSocketEx 的内部队列 m_pendingCallbacks 中等待处理。 我感觉对 CAsyncSocketLayer 的机制还不是很清晰,下面 再进一步分析一个 Layer 的实现吧.在 FileZilla 中已经实现了三个 Layer 了:ProxyLayer,sFtp Layer 和 SSL Layer.下面找个最简单的分析一 下啦, 就看 Proxy Layer 吧:) CAsyncProxySocketLayer 主要是提供了对 SOCKSv4,SOCKSv5 和 HTTP1.1 代 理的支持。通过其源代码的分析,其也主要是在 Connect 和 GetHos

4、tByName 这两个部分做了一些处理,使得 在连接应用服务器之前先连接上代 理服务器,并对客户端进行认证,在代理服务器上建立 circuits .其他的 就没什么了。在 CAsyncSocketLayer 的实现中,可以看到其主要还是利用 SendNext,ReceiveNext,XXXXNext 方法来处理数据,而不 是在末尾调用 CAsyncSocketLayer 基类的同样 方法。在发现错误的时候通过调用 TriggerEvent 和 DoLayerCallback 来 向上层报告相关的网络错误。 1.4 Get Nuggets from Misc 多语言支持 FileZilla 客户

5、端的多语言支持采取的是资源 DLL 的形式,每种 Language 都被编译成一个独立的 DLL, 这个 DLL 中包含了 FileZilla 的所有 Dialog,Menu,String Table, Toolbar,Version,Accelarator 资源。 本来不想去研究具体实现的,但我开了个 Win32 DLL 工程把 rc 文件加进去才发现我生成的文件大小是 108K, 而 FileZilla 发布的 FzResChs.dll 才 76K ,而且我里面就是一个 dummy DllMain 函数,为什么会有这么大 的文件大小差距呢?纯资源 DLL 难道不是这样做的么?我用 eXeS

6、cope 发现 FzResChs.dll 里面竟然没 有.text 和.rdata 等段, 呵呵: ) , 原来它没有代码的 (这也正是为什么叫做纯资源 DLL 吧?) , 于是在 Project Setting 的 Link Table 中加入/NOENTRY /nodefaultlib,从工程中删除 stdafx.h stdafx.cpp *.cpp, 重新编译。Okey,这下我们的 DLL 也 76K 啦_. 资源 DLL 是编译好了,下一步就是如何使用这个 DLL 啦。其实蛮简单的,在 GUI 主线程初始化的时候 (CWinApp:InitInstance),加载这个资源 DLL,然后

7、调用 AfxSetResourceHandle(hResourceDll), 将本线程的资源句柄设置为这个资源 DLL 就可以了。对于非 MFC 程序,就不能用 AfxSetResourceHandle, 可以用 FindResource,LoadResource,LockResource 来获取 DLL 模块中的资源。但这个感觉比较麻烦哦。 不知到 Windows 有没有提供跟 AfxSetResourceHandle 功能一样的 API 可以使用呢?我想应该是没有这样的 函数了:( 带消息处理的线程类封装 以前比较喜欢 MFC 的 CWinApp,因为它就是一个 GUI 线程类,支持线程消

8、息。在 FileZilla 中也有类似 这样的线程,可是它不是从 CWinApp 派生的,而是自己写的一个。来看一下它是如何实现线程消息的吧! 首 先定义一个 static 的线程函数 ThreadProc,并将其传给 CreateThread.ThreadProc 函数里通过 GetMessage/TranslateMessage/DispatchMessage 的一个消息 Pump 来获取线程的消息。在获取到消息后 再调用 OnThreadMessage 做消息的分发处理。发消息直接通过 PostThreadMessage API 调用来完成啦。到 现在,我想我们都必须再次看看 GetMe

9、ssage 的 MSDN 文档了,MSDN 中指出以 hWndNULL 为参数调用 GetMessage,会获取到线程消息队列中所有窗口和通过 PostThreadMessage API 调用发送过来的消息。而 每个 Win32 线程都有自己的消息队列的。 Option 配置选项和属性页的封装 在 FileZilla 项目中有众多的 Option 和属性页,下面我们就来分析一下 FileZilla 是如何组织这些属 性页的.下图是 FileZilla 的选项页: FileZilla 把所要的属性页放在 Option.h 中,然后将 Option.h 加到 stdafx.h 中使其全局化。其做了

10、一个 属性页的 GUI 框架,所有的属性页从 CSAPrefsSubDlg 派生,而主框架从 CSAPrefsDialog 派生。这个很自 然(我写的 UpdaterManager 也是这样做的哦_),FileZilla 将所有的配置不再写到系 统注册表中(现 在都提倡绿色软件啦),而是保存到一个 XML 格式配置文件 FileZilla.xml 中,这个文件就放在安装目录下。 现在看看 SetOption 和 GetOption 是如何实现的,FileZilla 把所有的 Option 的值分为 int 型和 string 型两类,并用 t_Option 结构记录每个 Option 在 XM

11、L 配置文件中的节点名和 Option 的 值类型(0 为字符串;1 为整型),然后用一个 static t_Option optionsOPTIONS_NUM的数组来做 nOptionID 到 Option 对应的 t_Option 结构的映射。 SetOption 和 GetOption 通过这个 nOptionID 来指定相应的 Option. 并且每次都需要调用 Init 函数装载配置文件 FileZilla.xml 来实现 Option 的 Set/Get 操作。为了缓解每 次文件存取的延迟,COption 机制还使用了 Cache 的思想(见 static t_OptionsCac

12、he m_OptionsCacheOPTIONS_NUM),在系统启动是读取配置,以后每次对配置的更改都会写到配置文件中并 且 Cache 起来。这样下次 Get 的时候就可以直接取了不用在去加载配置文件了。 Base64 Encoding Base64 编码主要是将任意长度的 sequences of octets 编码成 not be humanly readable。根据 RFC2045介 绍, 编码后的数据将比编码前最多大33%左右。 Base64 Encoding将3个字节的数据 (3*8=24bits) 编码成 4 个 Base64 Encoding 字母表中的字母(4*6=24b

13、its),Base64 Alphabet 就是字母(大小写一共 52 个),数字(10 个)和+ /一共 64 个字符组成,所以叫做 Base64 编码。每个 Base64 Alphabet 中的字母用一 个 6bits 来表示。Base64 编码将编码后的字符按行来组织,每行不得多于 76 个字符。另外对于编码最后少 于 3 个字节 的,采取补零和用“=“来标示。具体可以参考 RFC2045. UTF-8 最早只有 Ascii 和 EBCDIC 编码,后来为了支持软件的国际化,使用了 UTF-8 Encoding。为支持多国的 字符编码,ISO/IEC 10646 定义了两套编码方案:UCS

14、-4 和 UCS-2。UCS-4 使用四个字节来标示一个字符; UCS-2 使用两个字节来标示一个字符。Unicode 标准的 Version 2 只和 ISO/IEC 10646 的 UCS-2 编码方案 兼容。UTF-8 是 UCS Transformation Format 8 的缩写(Abbreviation),它只是一个传输格式,并不是 字符集哦。UTF- 8 的基本思想是用 1 到 6 个字节来表示一个 UCS 字符,根据 UCS 字符的编码设置这 1-6 个字 节的 Most significant bits 为相应的 1/0 串。根据 UTF-8 编码后的 Sequence 的

15、第一个字节的最前面的 1 的数量就可以知道是用多少个字节来表示这个 UCS 字符的。比 如对于 UTF-8 编码 110xxxxx 10xxxxxx ,我 们就知道其使用 2 个字节来表示这个 UCS 字符。 1.5 Explore FileZilla Client GUI 上 图给出了 FillZilla 客户端 GUI 界面的框架:最上面是一个 Rebar(m_pWndReBar),它由一个 Toolbar(m_pWndToolBar)和一个 DialogBar(m_pWndDlgBar)组成。最下面的是一个 Status Bar (m_wndStatusBar) 。 中间是一个 Spli

16、tter 窗口(m_wndVertSplitter),这个 SplitterWnd 是三行一列的, 第一行是一个 CStatusView,第三行是一个 CQueueView;第二行又是一个一行两列的 SplitterWnd,左边 是 LocalFile View,右边是 RemoteFile View;并且这两个 File View 都是一个两行一列的 SplitterWnd. 复杂吧? _ 1.7 Knowledge Repository 获取一个 Socket 的接收缓冲的 Pending Data 的数据量大小: ioctlsocket(hSocket,FIONREAD, WSAAsyncGetHostByName: 这是 gethostbyname 的异步版本。在获取完成后会以指定的消息发送到指定的窗口。 WSACancelAsyncRequest: 取消未完成的异步 Winsock 操作,这些操作主要就是 WSAAsyncGetXByY 型的异步调用。 FindFir

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号