91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎樣進行FileZilla的源代碼分析

發布時間:2021-11-02 16:57:14 來源:億速云 閱讀:132 作者:柒染 欄目:系統運維

本篇文章為大家展示了怎樣進行FileZilla的源代碼分析,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

FileZilla是一種快速、可信賴的FTP客戶端以及服務器端開放源代碼程式,具有多種特色、直覺的接口。今天就給大家分析下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()時,通過CListenSocket來監聽標準的FTP 21端口,通過CAdminListenSocket來監聽admin端口(缺省是14147),這兩個類都繼承于CAsyncSocketEx,這個類是FileZilla中所有socket處理的基類,搞清楚這個類可以清楚明白socket處理的機制。

這個類的名字來源于MFC類CAsyncSocket,CAsyncSocketEx完全兼容于CAsyncSocket,在CAsyncSocket上寫的代碼可以一字不動的在CAsyncSocketEx下編譯通過,CAsyncSocketEx還做了一些功能上的擴展和性能上的優化。

CAsyncSocketEx和另兩個類CAsyncSocketExHelperWindow以及CAsyncSocketExLayer緊密相關,CAsyncSocketExLayer的作用類似于J2EE中的Interceptor的作用,這里可以先不討論。

CAsyncSocketEx采用的是消息處理的機制,即監聽的端口有活動,如有數據要接收、發送等,通過發送消息來實現這種信息的通訊,這里具體到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.

簡單地說,這個方法可以讓windows在SOCKET s指定的socket上,當指定的事件lEvent發生時,發送消息wMsg到窗口hWnd。

由于windows的消息機制必須使用一個windows窗口,因此CAsyncSocketEx必須創建一個windows窗口來接收這種消息,這就是類CAsyncSocketExHelperWindow的主要作用,當然這個窗口并不是必須被顯示出來的,只要讓系統知道有這個windows存在(即有hWnd)就可以了。

在CAsyncSocketEx中,定義了一個static的鏈表:

static struct t_AsyncSocketExThreadDataList

{

t_AsyncSocketExThreadDataList *pNext;

t_AsyncSocketExThreadData *pThreadData;

} *m_spAsyncSocketExThreadDataList;

這個鏈表維護了一個t_AsyncSocketExThreadData鏈,看一下這個struct的定義:

struct t_AsyncSocketExThreadData

{

CAsyncSocketExHelperWindow *m_pHelperWindow;

int nInstanceCount;

DWORD nThreadId;

std::list layerCloseNotify;

} *m_pLocalAsyncSocketExThreadData;

看名稱就知道,這是一個與線程thread有關的結構,事實上這個結構描述了一個分發線程。

在FileZilla的實現中,整個靜態的類關系是這樣的:

一個CAsyncSocketEx代表了一個socket,即在某個端口進行監聽的socket,如前面提到的標準的FTP 21端口、admin端口等等。

一個CAsyncSocketExHelperWindow代表了一個負責消息分發的線程,即負責接收到socket(CAsyncSocketEx)的活動,然后分發到不同的處理類CAsyncSocketEx。每一個CAsyncSocketExHelperWindow一一對應于一個分發線程,即一個分發線程只有一個CAsyncSocketExHelperWindow,反之亦然。結構t_AsyncSocketExThreadData即描述了分發線程與CAsyncSocketExHelperWindow的關系。

CAsyncSocketExHelperWindow可以為多個CAsyncSocketEx進行分發,而CAsyncSocketEx只能由一個CAsyncSocketExHelperWindow進行分發。現在仔細研究一下結構t_AsyncSocketExThreadData:

struct t_AsyncSocketExThreadData

{

CAsyncSocketExHelperWindow *m_pHelperWindow; // 這個線程對應的CAsyncSocketExHelperWindow

int nInstanceCount; // 當前分發線程對應了幾個CAsyncSocketEx

DWORD nThreadId; // 當前線程的threadID

std::list layerCloseNotify; // 這個以后再說

} *m_pLocalAsyncSocketExThreadData;

這段代碼是在類CAsyncSocketEx中定義的,即m_pLocalAsyncSocketExThreadData定義了當前CAsyncSocketEx所對應的分發線程,即CAsyncSocketExHelperWindow。

全局的m_spAsyncSocketExThreadDataList則定義了一個t_AsyncSocketExThreadData(即分發線程)的鏈表,也就是說FileZilla可以有多個分發線程,每個分發線程對應多個socket,即CAsyncSocketEx。

舉一個實際的場景:

在FileZilla Server啟動時,缺省監聽了兩個端口:21和admin端口,因此就有兩個socket,即兩個CAsyncSocketEx。

這兩個CAsyncSocketEx共用一個分發線程:t_AsyncSocketExThreadData

當有用戶通過FTP連接上server并通過get/mget命令下載文件時,這時FTP服務器會啟動一個傳輸線程在一個臨時端口進行監聽,這時會增加一個CAsyncSocketEx,同時也增加一個負責這個CAsyncSocketEx的分發線程,因此m_spAsyncSocketExThreadDataList里也會增加一個結點。

這時的狀況是:

一個m_spAsyncSocketExThreadDataList鏈,兩個t_AsyncSocketExThreadData,三個CAsyncSocketEx。

上述內容就是怎樣進行FileZilla的源代碼分析,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

法库县| 清远市| 丰原市| 九龙城区| 惠水县| 凤冈县| 临沭县| 乐亭县| 民勤县| 南昌县| 星座| 岳阳县| 河西区| 沾化县| 青阳县| 东乡| 灵宝市| 华容县| 宾阳县| 江油市| 汾阳市| 赣州市| 阿拉善右旗| 乌兰浩特市| 石渠县| 枣阳市| 彭州市| 宜兴市| 卢湾区| 天峻县| 常宁市| 清新县| 涞源县| 石屏县| 漳州市| 镇远县| 泌阳县| 特克斯县| 蒲江县| 久治县| 江源县|