• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大漠落日

            while(!dead) study++;
            posts - 46, comments - 126, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            FileZilla Server源碼分析(1)

            Posted on 2010-06-01 13:51 亂78糟 閱讀(6248) 評論(4)  編輯 收藏 引用 所屬分類: 開源
            之所以有本系列的分析,是因為兩點:
            1. FileZilla 是目前非常火爆的開源ftp項目,整個項目采用C++代碼編寫,代碼緊湊可讀性高,值得學習(缺陷是注釋太少)。
            2. 網絡上已有的對該源碼的分析基于的版本是0.9.18,分析比較粗略,無論是框架還是細節。
            這里僅僅是我個人對FileZilla Server源碼0.9.34版本的分析,能力有限,不足和錯誤之處還希望大家不吝斧正。
            本片作為開篇,略過如何編譯(該源碼源碼用VS2010編譯),如何配置,如何使用。FileZilla官網提供了程序和源碼下載(源碼包含在程序中,安裝時默認為不安裝),以及編譯步驟和注意事項,感興趣的朋友可以自行去官網尋找或google。

            感謝:分析時參考了網友的系列文章《FileZilla FTP服務器源代碼分析》,大家可以參照比對。

            首先預覽一下源碼目錄source文件夾下的大致文件布局。



            6個子目錄,核心的代碼(線程、socket、命令等)都放在當前目錄下。6個子目錄及對應代碼功能:

            子目錄
            功能
            includes
            當前版本下只有一個子目錄openssl,看名識意,不多解釋
            install
            安裝腳本和資源
            interface
            界面UI實現類
            misc
            混雜類,比較重要的如md5,StdString等
            res
            程序編譯資源,目前只有一個icon
            tinyxml
            著名的一款基于DOM模型小巧開源的xml解析器

            當前source目錄下源碼按實現功能大致又分為以下幾種類型:

            功能分類
            包括的文件
            網絡
            全體文件名含socket的,Server.*,
            線程
            文件名包含Thread的文件
            輔助
            version.*,MFC64bitFix.*,conversion.*,config.h,service.cpp等除去網絡和線程的文件

            文件目錄結構分析完了,面對眾多.h.cpp文件,需要做一些去繁取精的操作。從無關緊要的地方開始,例如version.*。

            version.*中聲明定義了一個函數CStdString GetVersionString(),需要注意的就是CStdString這個類,它的實現在misc/stdString.h文件中,這個類文件較大,功能稍后部分再分析。說句實話,這個函數是很值得收藏的。

            Thread.*定義了線程類CThread,只需要注意那個Run函數中對線程消息做了處理,有用的消息交由虛函數OnThreadMessage處理。

            作為Visual Studio生成的C++代碼中最常出現的兩個文件stdafx.h和stdafx.cpp,我們勢必需要首先弄清楚它們到底包含了哪些頭文件,定義了哪些宏,什么了哪些函數以及結構體。

            stdafx.h中包含了自己的config.h這個文件,順便看一下這個文件的作用,代碼很少目的有兩個,強制使用unicode編譯和檢測是否安裝了最新SDK。還包含了MFC64bitFix.h這個文件,也跟進去看看。定義了一個存儲文件屬性的結構體CFileStatus64,以及操作它的若干全局函數,這個文件名有點怪,和包含的功能不匹配。
            第55行遇到了條件宏#ifdef MMGR,編譯條件中有定義,包含misc/mmgr.h文件。mmgr是用于管理和跟蹤內存的代碼,之后會重點詳細分析。
            conversion.h中聲明的函數用于ANSI和UTF8字符的互相轉換,不多解釋。
            AsyncSocketEx.h中實現了異步socket,之后的ControlSocket,AdminListenSocket等文件中什么的socket都是由CAsyncSocketEx類派生來的,之后分析。
            至此,stdafx.h中頭文件包含全部結束,下面就是宏定義了。

            先補充一個知識點,各消息的值范圍和作用見下圖:


            注冊了WM_FILEZILLA_THREADMSG消息用來線程之 間通信,定義了WM_FILEZILLA_SERVERMSG用于進 程間通信,即FileZilla server.exe和FileZilla Server Interface.exe。
            這里僅貼出兩處源碼中調用這兩個消息的例子,便可得知后面定義的幾個常數宏的用處。
            //ControlSocket.cpp第400行
            SendStatus(_T("could not send reply, disconnected."), 0);
            m_pOwner
            ->PostThreadMessage(WM_FILEZILLA_THREADMSG, FTM_DELSOCKET, m_userid);

            //Server.cpp第813行器
            int index = GetNextThreadNotificationID();
            CServerThread *pThread = new CServerThread(WM_FILEZILLA_SERVERMSG + index);
            m_ThreadNotificationIDs[index] = pThread;

            從上面代碼可以看出PostThreadMessage的第二個參數wParam就是定義的數字宏,第三個參數是結構t_statusmsg,這些宏功能分別是:

            FSM_STATUSMESSAGE:在管理窗口或log中顯示并記錄狀態信息
            FSM_CONNECTIONDATA:和連接相關的信息,如新用戶連接,登錄,退出等
            FSM_THREADCANQUIT:退出線程
            FSM_SEND:發送數據時用于管理窗口統計發送字節數
            FSM_RECV:接受數據時用于管理窗口統計接收字節數
            其余的就不多寫了,宏名比較直觀的顯示出意思。

            在往下定義了一系列的結構如t_statusmsg,之后用到的地方在詳述,知道這些結構在哪個文件中定義的就行了。
            接著就是extern HWND hMainWnd; 這個外聯的句柄就是下一節將要提到的CServer的窗口類句柄。
            最后定義了一個CCriticalSectionWrapper類和兩個幫助檢測臨界區死鎖的函數,尤其是前者,DEBUG版本時錯誤的使用將導致當前線程掛起。

            SpeedLimit.*:  速度限制(包括時間段限制)

            這里針對UI性比較強,FillBuffer這個函數將所有限制條件格式化成一個char字符串,ParseBuffer則是解析這個字符串,采用這個 類,可以輕松實現強大的自定義限速功能。

            defs.h:這個類定義了服務器的狀態,如在線、離線、鎖住 等。


            Options.*,OptionTypes.h

            OptionTypes.h中定義了一個結構數組m_Optinons,保存所有配置項信息,如是否使用SSL,同時在線最大用戶數量,上傳下載限速等等,所有這些大部分都被使用在Option那個對話框UI上。
            t_option結構中有一個BOOL bOnlyLocal成員用于標示該項是否可以僅能夠被本地連接修改,數組中只有最后兩項Server name 和 server display name為TRUE,Options類就是操作配置文件的實體類(注意,它使用了tinyXML),服務器的配置文件存儲在exe同級目錄下,叫FileZilla Srver.xml。Options的主要操作是針對內存中的配置,只有與默認值不同的項才會存入配置文件中。
            Options還有一個隱藏的friend窗體類 COptionsHelperWindow,定義在cpp文件中,這個類用于通過用post WM_USER給窗體消息這種異步的方式去更新option實例,而不是options類自身。
            有了Options類和OptionTypes.h中定義的配置類型,就可以通過諸如 m_pOptions->GetOptionVal(OPTION_ENABLELOGGING)這樣的方法方便的獲取到配置。

            FileLogger.*  日志

            這個類中包含Options類的一個對象指針,用來讀取日志文件的相關配置。

            iputils.* 判斷IP合法性以及是否處于某個過濾范圍

            它采用了大名鼎鼎的boost庫的regex來判斷,這個庫之后有時間一定要好好研究一下。

            autobanmanager.*  阻止用戶繼續登錄的方法類文件

            AutoBan這個設置項是一個非常浪費資源的,因為它對每一個失敗的ip都要記錄查詢內存中的兩個map。

            Accounts.* 賬戶

            Accounts.h中聲明了3個類,t_directory,t_group,還有繼承于t_group的t_user。
            t_directory僅僅含有一些權限聲明,相當于一個struct,被t_group和t_user使用。
            剩余兩個類主要做的事是對配置的讀取分析,所有的數據都是基于字符串的。

            permission.* 對用戶、群組訪問資源進行鑒權

            權限配置信息記錄在FileZilla Server.xml中。
            服務器對每一個group和user都有權限限制,group權限優先于user權限,在CheckFilePermissions 函數中可以看出。

            conversion.* utf8和ansi字符的相互轉化


            ExternalIpCheck.*  PASV模式

            根據配置獲取ip。

            所有輔助文件已經分析完畢,下級節開始分析socket和線程類。

            Feedback

            # re: FileZilla Server源碼分析(1)  回復  更多評論   

            2010-07-23 15:53 by xukq
            怎么編譯FileZilla Server源碼0.9.34版本

            # re: FileZilla Server源碼分析(1)  回復  更多評論   

            2010-07-23 16:20 by xukq
            編譯都不會呀

            # re: FileZilla Server源碼分析(1)  回復  更多評論   

            2013-03-07 18:02 by 弓長
            樓主現在還記得這個東西么? 我最近一直在研究FileZilla, 有一個問題現在解決不了, 就是程序是在哪邊對用戶列表進行維護的呢? 我指的是在哪邊對FileZilla Server.xml文件中的Users, Groups進行實時設置, 這讓我很困惑, 很多疑似點我都加了斷點, 可是程序卻執行不進去??!

            # re: FileZilla Server源碼分析(1)  回復  更多評論   

            2013-03-07 18:04 by
            樓主現在還記得這個東西么? 我最近一直在研究FileZilla, 有一個問題現在解決不了, 就是程序是在哪邊對用戶列表進行維護的呢? 我指的是在哪邊對FileZilla Server.xml文件中的Users, Groups進行實時設置, 這讓我很困惑, 很多疑似點我都加了斷點, 可是程序卻執行不進去?。?/div>
            久久国产欧美日韩精品| 国产精品无码久久综合 | 欧美亚洲日本久久精品| 国产午夜久久影院| 蜜臀av性久久久久蜜臀aⅴ| 青青草原综合久久大伊人| 久久嫩草影院免费看夜色| 久久97久久97精品免视看秋霞| 久久精品成人免费网站| 久久香蕉超碰97国产精品| 久久精品国产亚洲av日韩| AV无码久久久久不卡网站下载| 国内精品久久人妻互换| 国产精品女同久久久久电影院| 国产精品一久久香蕉国产线看| 久久国产色AV免费看| 久久精品国产秦先生| 久久精品视屏| 香蕉久久夜色精品国产尤物| 亚洲va久久久噜噜噜久久男同| 2021少妇久久久久久久久久| 99久久精品免费国产大片| 伊人色综合久久天天网| 久久久久久综合网天天| 久久久久久久久久久久中文字幕| 精品久久久久久| 欧美久久久久久午夜精品| 性做久久久久久久久浪潮| 人妻精品久久无码区| 99久久国产免费福利| 久久精品综合网| 91超碰碰碰碰久久久久久综合| 久久久久亚洲爆乳少妇无| 久久综合国产乱子伦精品免费| 99久久成人18免费网站| 无码精品久久久久久人妻中字| 成人a毛片久久免费播放| 色婷婷久久综合中文久久蜜桃av| 93精91精品国产综合久久香蕉| 亚洲va久久久噜噜噜久久天堂| 99久久精品国产一区二区三区 |