您好,登錄后才能下訂單哦!
本篇文章為大家展示了怎樣進(jìn)行FileZilla的源代碼分析,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
FileZilla是一種快速、可信賴的FTP客戶端以及服務(wù)器端開(kāi)放源代碼程式,具有多種特色、直覺(jué)的接口。今天就給大家分析下FileZilla的源代碼。
< type="text/javascript"> < src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> < type="text/javascript"> < src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
CServer在Create()時(shí),通過(guò)CListenSocket來(lái)監(jiān)聽(tīng)標(biāo)準(zhǔn)的FTP 21端口,通過(guò)CAdminListenSocket來(lái)監(jiān)聽(tīng)admin端口(缺省是14147),這兩個(gè)類(lèi)都繼承于CAsyncSocketEx,這個(gè)類(lèi)是FileZilla中所有socket處理的基類(lèi),搞清楚這個(gè)類(lèi)可以清楚明白socket處理的機(jī)制。
這個(gè)類(lèi)的名字來(lái)源于MFC類(lèi)CAsyncSocket,CAsyncSocketEx完全兼容于CAsyncSocket,在CAsyncSocket上寫(xiě)的代碼可以一字不動(dòng)的在CAsyncSocketEx下編譯通過(guò),CAsyncSocketEx還做了一些功能上的擴(kuò)展和性能上的優(yōu)化。
CAsyncSocketEx和另兩個(gè)類(lèi)CAsyncSocketExHelperWindow以及CAsyncSocketExLayer緊密相關(guān),CAsyncSocketExLayer的作用類(lèi)似于J2EE中的Interceptor的作用,這里可以先不討論。
CAsyncSocketEx采用的是消息處理的機(jī)制,即監(jiān)聽(tīng)的端口有活動(dòng),如有數(shù)據(jù)要接收、發(fā)送等,通過(guò)發(fā)送消息來(lái)實(shí)現(xiàn)這種信息的通訊,這里具體到windows socket的API就是WSAAsyncSelect,它的原型是:
int WSAAsyncSelect(
SOCKET s,
HWND hWnd,
unsigned int wMsg,
long lEvent
);
Parameters
s
[in] Descriptor identifying the socket for which event notification is required.
hWnd
[in] Handle identifying the window that will receive a message when a network event occurs.
wMsg
[in] Message to be received when a network event occurs.
lEvent
[in] Bitmask that specifies a combination of network events in which the application is interested.
簡(jiǎn)單地說(shuō),這個(gè)方法可以讓windows在SOCKET s指定的socket上,當(dāng)指定的事件lEvent發(fā)生時(shí),發(fā)送消息wMsg到窗口hWnd。
由于windows的消息機(jī)制必須使用一個(gè)windows窗口,因此CAsyncSocketEx必須創(chuàng)建一個(gè)windows窗口來(lái)接收這種消息,這就是類(lèi)CAsyncSocketExHelperWindow的主要作用,當(dāng)然這個(gè)窗口并不是必須被顯示出來(lái)的,只要讓系統(tǒng)知道有這個(gè)windows存在(即有hWnd)就可以了。
在CAsyncSocketEx中,定義了一個(gè)static的鏈表:
static struct t_AsyncSocketExThreadDataList
{
t_AsyncSocketExThreadDataList *pNext;
t_AsyncSocketExThreadData *pThreadData;
} *m_spAsyncSocketExThreadDataList;
這個(gè)鏈表維護(hù)了一個(gè)t_AsyncSocketExThreadData鏈,看一下這個(gè)struct的定義:
struct t_AsyncSocketExThreadData
{
CAsyncSocketExHelperWindow *m_pHelperWindow;
int nInstanceCount;
DWORD nThreadId;
std::list layerCloseNotify;
} *m_pLocalAsyncSocketExThreadData;
看名稱就知道,這是一個(gè)與線程thread有關(guān)的結(jié)構(gòu),事實(shí)上這個(gè)結(jié)構(gòu)描述了一個(gè)分發(fā)線程。
在FileZilla的實(shí)現(xiàn)中,整個(gè)靜態(tài)的類(lèi)關(guān)系是這樣的:
一個(gè)CAsyncSocketEx代表了一個(gè)socket,即在某個(gè)端口進(jìn)行監(jiān)聽(tīng)的socket,如前面提到的標(biāo)準(zhǔn)的FTP 21端口、admin端口等等。
一個(gè)CAsyncSocketExHelperWindow代表了一個(gè)負(fù)責(zé)消息分發(fā)的線程,即負(fù)責(zé)接收到socket(CAsyncSocketEx)的活動(dòng),然后分發(fā)到不同的處理類(lèi)CAsyncSocketEx。每一個(gè)CAsyncSocketExHelperWindow一一對(duì)應(yīng)于一個(gè)分發(fā)線程,即一個(gè)分發(fā)線程只有一個(gè)CAsyncSocketExHelperWindow,反之亦然。結(jié)構(gòu)t_AsyncSocketExThreadData即描述了分發(fā)線程與CAsyncSocketExHelperWindow的關(guān)系。
CAsyncSocketExHelperWindow可以為多個(gè)CAsyncSocketEx進(jìn)行分發(fā),而CAsyncSocketEx只能由一個(gè)CAsyncSocketExHelperWindow進(jìn)行分發(fā)?,F(xiàn)在仔細(xì)研究一下結(jié)構(gòu)t_AsyncSocketExThreadData:
struct t_AsyncSocketExThreadData
{
CAsyncSocketExHelperWindow *m_pHelperWindow; // 這個(gè)線程對(duì)應(yīng)的CAsyncSocketExHelperWindow
int nInstanceCount; // 當(dāng)前分發(fā)線程對(duì)應(yīng)了幾個(gè)CAsyncSocketEx
DWORD nThreadId; // 當(dāng)前線程的threadID
std::list layerCloseNotify; // 這個(gè)以后再說(shuō)
} *m_pLocalAsyncSocketExThreadData;
這段代碼是在類(lèi)CAsyncSocketEx中定義的,即m_pLocalAsyncSocketExThreadData定義了當(dāng)前CAsyncSocketEx所對(duì)應(yīng)的分發(fā)線程,即CAsyncSocketExHelperWindow。
全局的m_spAsyncSocketExThreadDataList則定義了一個(gè)t_AsyncSocketExThreadData(即分發(fā)線程)的鏈表,也就是說(shuō)FileZilla可以有多個(gè)分發(fā)線程,每個(gè)分發(fā)線程對(duì)應(yīng)多個(gè)socket,即CAsyncSocketEx。
舉一個(gè)實(shí)際的場(chǎng)景:
在FileZilla Server啟動(dòng)時(shí),缺省監(jiān)聽(tīng)了兩個(gè)端口:21和admin端口,因此就有兩個(gè)socket,即兩個(gè)CAsyncSocketEx。
這兩個(gè)CAsyncSocketEx共用一個(gè)分發(fā)線程:t_AsyncSocketExThreadData
當(dāng)有用戶通過(guò)FTP連接上server并通過(guò)get/mget命令下載文件時(shí),這時(shí)FTP服務(wù)器會(huì)啟動(dòng)一個(gè)傳輸線程在一個(gè)臨時(shí)端口進(jìn)行監(jiān)聽(tīng),這時(shí)會(huì)增加一個(gè)CAsyncSocketEx,同時(shí)也增加一個(gè)負(fù)責(zé)這個(gè)CAsyncSocketEx的分發(fā)線程,因此m_spAsyncSocketExThreadDataList里也會(huì)增加一個(gè)結(jié)點(diǎn)。
這時(shí)的狀況是:
一個(gè)m_spAsyncSocketExThreadDataList鏈,兩個(gè)t_AsyncSocketExThreadData,三個(gè)CAsyncSocketEx。
上述內(nèi)容就是怎樣進(jìn)行FileZilla的源代碼分析,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。