青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大漠落日

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

FileZilla Server源碼分析(1)

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

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

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



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

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

當(dāng)前source目錄下源碼按實現(xiàn)功能大致又分為以下幾種類型:

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

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

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

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

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

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

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


注冊了WM_FILEZILLA_THREADMSG消息用來線程之 間通信,定義了WM_FILEZILLA_SERVERMSG用于進(jìn) 程間通信,即FileZilla server.exe和FileZilla Server Interface.exe。
這里僅貼出兩處源碼中調(diào)用這兩個消息的例子,便可得知后面定義的幾個常數(shù)宏的用處。
//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的第二個參數(shù)wParam就是定義的數(shù)字宏,第三個參數(shù)是結(jié)構(gòu)t_statusmsg,這些宏功能分別是:

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

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

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

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

defs.h:這個類定義了服務(wù)器的狀態(tài),如在線、離線、鎖住 等。


Options.*,OptionTypes.h

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

FileLogger.*  日志

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

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

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

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

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

Accounts.* 賬戶

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

permission.* 對用戶、群組訪問資源進(jìn)行鑒權(quán)

權(quán)限配置信息記錄在FileZilla Server.xml中。
服務(wù)器對每一個group和user都有權(quán)限限制,group權(quán)限優(yōu)先于user權(quán)限,在CheckFilePermissions 函數(shù)中可以看出。

conversion.* utf8和ansi字符的相互轉(zhuǎn)化


ExternalIpCheck.*  PASV模式

根據(jù)配置獲取ip。

所有輔助文件已經(jīng)分析完畢,下級節(jié)開始分析socket和線程類。

Feedback

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

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

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

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

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

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

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

2013-03-07 18:04 by
樓主現(xiàn)在還記得這個東西么? 我最近一直在研究FileZilla, 有一個問題現(xiàn)在解決不了, 就是程序是在哪邊對用戶列表進(jìn)行維護(hù)的呢? 我指的是在哪邊對FileZilla Server.xml文件中的Users, Groups進(jìn)行實時設(shè)置, 這讓我很困惑, 很多疑似點我都加了斷點, 可是程序卻執(zhí)行不進(jìn)去!!
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美大尺度在线| 激情欧美一区| 欧美在线你懂的| 亚洲一区一卡| 亚洲一区视频在线观看视频| 亚洲私拍自拍| 欧美一区二区三区在线看| 亚洲欧美日韩另类| 欧美一级欧美一级在线播放| 久久精品30| 欧美大片免费观看| 欧美体内谢she精2性欧美| 国产精品视频999| 在线观看亚洲a| 亚洲视频香蕉人妖| 久久精品视频在线看| 免费视频最近日韩| 亚洲精品久久久久| 午夜国产精品影院在线观看| 午夜精品福利电影| 久久国产毛片| 欧美11—12娇小xxxx| 欧美高清视频免费观看| 欧美高清视频www夜色资源网| 免费成人av在线| 欧美精品久久久久久久久老牛影院| 亚洲激情自拍| 欧美一区91| 欧美日韩国产成人精品| 国产一区二区精品在线观看| 亚洲精品激情| 久久久久久成人| 国产精品99久久久久久宅男| 久色婷婷小香蕉久久| 国产精品欧美日韩一区| 亚洲欧洲一区| 欧美日韩精品福利| 国产日韩综合| 这里只有精品在线播放| 麻豆av一区二区三区久久| 一区二区三区高清在线观看| 久久综合狠狠综合久久激情| 国产精品美女久久久免费| 亚洲精品在线免费| 在线亚洲电影| 久久久久久久国产| 国产精品午夜电影| 9i看片成人免费高清| 久久蜜桃精品| 亚洲网站在线看| 欧美日韩亚洲一区二区三区四区| 亚洲大胆在线| 男女视频一区二区| 久久国产免费看| 国产视频在线观看一区二区| 午夜精品视频在线| 国产精品99久久久久久人| 欧美日本韩国一区二区三区| 99re6这里只有精品| 亚洲国产精品激情在线观看| 久久久免费精品| 精品999成人| 美女诱惑一区| 久久在线播放| 亚洲欧洲一区| 日韩视频在线观看免费| 欧美女人交a| 国产精品99久久久久久宅男| 亚洲精品综合精品自拍| 欧美日韩精品综合在线| 亚洲一级片在线观看| 一二美女精品欧洲| 国产农村妇女精品一区二区| 久久成人免费| 麻豆成人在线| 在线一区二区三区做爰视频网站 | 久久这里有精品视频| 欧美专区日韩专区| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产亚洲成精品久久| 欧美中文在线视频| 欧美一站二站| 亚洲国产精品黑人久久久| 亚洲电影在线免费观看| 欧美日韩免费看| 欧美一区二区视频免费观看 | 久久免费99精品久久久久久| 亚洲精品影视在线观看| 亚洲亚洲精品在线观看 | 亚洲欧美一区二区三区在线| 午夜在线视频一区二区区别| 亚洲日本理论电影| 99热精品在线| 国产亚洲精品资源在线26u| 蘑菇福利视频一区播放| 欧美精品在欧美一区二区少妇| 亚洲欧美福利一区二区| 久久久久久久久久码影片| 99成人在线| 久久精品国产欧美激情| 日韩视频一区二区三区在线播放免费观看 | 久久精品久久综合| 亚洲精品美女在线观看| 亚洲一区二区影院| 91久久精品一区| 亚洲欧美影院| 亚洲精品女av网站| 欧美一级网站| 亚洲美女视频在线免费观看| 午夜精品福利在线| 亚洲网友自拍| 欧美成人在线免费视频| 久久久久久久久综合| 欧美午夜在线一二页| 欧美不卡在线| 国产一区二区福利| 亚洲一区二区三区四区中文| av成人免费观看| 毛片一区二区| 久久久在线视频| 国产精品成人观看视频国产奇米| 欧美福利小视频| 国内精品一区二区三区| 亚洲欧美国产高清| 在线亚洲自拍| 欧美另类一区| 亚洲国产精品第一区二区三区| 尤物视频一区二区| 久久精品亚洲一区| 久久精品亚洲一区二区| 国产精品国产三级国产普通话蜜臀| 亚洲国产成人久久| 亚洲激情视频在线播放| 浪潮色综合久久天堂| 久热精品视频在线| 韩国欧美国产1区| 欧美一区二区在线观看| 欧美在线观看网站| 国产精品一区=区| 午夜在线一区二区| 久久夜色精品亚洲噜噜国产mv| 国产亚洲精品福利| 欧美在线一区二区| 久久综合色婷婷| 在线视频成人| 美女被久久久| 亚洲高清不卡| 日韩亚洲欧美精品| 又紧又大又爽精品一区二区| 欧美一区二区三区在线看| 欧美一级一区| 国产麻豆91精品| 久久er精品视频| 美女主播精品视频一二三四| 亚洲黄色成人| 欧美日本久久| 中文在线资源观看网站视频免费不卡 | 久久躁狠狠躁夜夜爽| 国内一区二区三区| 久久综合久久久| 亚洲精品永久免费| 欧美日韩视频在线| 亚洲在线视频| 另类av导航| 一区二区久久| 国产精品一区毛片| 久久综合狠狠综合久久综青草| 欧美电影电视剧在线观看| 99国产精品久久久久久久| 国产精品久久综合| 久久嫩草精品久久久久| 日韩系列欧美系列| 久久人体大胆视频| 9久草视频在线视频精品| 国产精品系列在线| 免费观看成人www动漫视频| 夜夜嗨av一区二区三区免费区| 久久精品免视看| 日韩一区二区精品在线观看| 国产日韩欧美一二三区| 欧美www视频| 午夜精品久久久99热福利| 亚洲国产精品久久久久秋霞不卡| 午夜精品久久久久久久久久久久 | 久久深夜福利免费观看| 99精品久久久| 欧美成人激情视频免费观看| 亚洲欧美日韩网| 亚洲福利精品| 国产一区二区三区自拍 | 欧美午夜剧场| 欧美成人一区在线| 久久精品国产清高在天天线| 亚洲毛片av在线| 欧美电影在线观看| 久久久亚洲精品一区二区三区 | 亚洲一区二区三区乱码aⅴ| 在线欧美亚洲| 国产一区二区三区在线观看精品 | 国产欧美精品国产国产专区|