成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

FileZilla 源代碼分析10

系統 Linux
FileZilla是一個免費開源的FTP客戶端軟件,分為客戶端版本和服務器版本,具備所有的FTP軟件功能。可控性、有條理的界面和管理多站點的簡化方式使得Filezilla客戶端版成為一個方便高效的FTP客戶端工具,而FileZilla Server則是一個小巧并且可靠的支持FTP&SFTP的FTP服務器軟件。

FileZilla是一種快速、可信賴的FTP客戶端以及服務器端開放源代碼程式,具有多種特色、直覺的接口。本文就給大家分析下FileZilla的源代碼。

前面已經分析過了FTP客戶登錄服務器的過程,現在來看一下常見的ls命令的處理過程。

用戶在FTP客戶端輸入ls命令后,ftp.exe首先發出port請求給服務器,在CControlSocket的ParseCommand()中被處理。

PORT命令的參數是形如:127.0.0.1.4.9,前4個表示客戶端的IP地址,后兩個根據規則4 * 256 + 9 = 1033,表示FTP客戶端臨時建立的用來與服務器建立數據連接的端口,例子所示為1033端口。

PORT命令的處理過程的代碼中前面都是用來獲取IP和臨時端口的:

case COMMAND_PORT:
...
port += 256 * _ttoi(args.Right(args.GetLength() - (i + 1))); // add ms byte to server socket
ip = args.Left(i);
...

下面:
m_transferstatus.ip = ip;
m_transferstatus.port = port;
m_transferstatus.pasv = 0;
Send(_T("200 Port command successful"));
break;
只是將FTP客戶端提供的臨時端口記錄到m_transferstatus中,然后發出200 Port command successful,等待FTP客戶端的下一個命令。由于用戶輸入的是ls命令,ftp.exe在PORT之后,發出NLST命令。

在case COMMAND_NLST的處理中,先是進行了一系列的參數、權限檢查,一切OK后:
if (!m_transferstatus.pasv) // 主動模式
{
   ...
}
else // 被動模式
{
   ...
}
由于主動模式是缺省值,因此看一下里面的代碼:
CTransferSocket *transfersocket = new CTransferSocket(this);
m_transferstatus.socket = transfersocket;
transfersocket->Init(pResult, TRANSFERMODE_NLST); // 只是一些參數的初始化
if (m_transferMode == mode_zlib) // 傳輸方式是否使用壓縮方式,缺省不使用,詳細參見FTP規范
{
if (!transfersocket->InitZLib(m_zlibLevel))
{
   Send(_T("550 could not initialize zlib, please use MODE S instead"));
   ResetTransferstatus();
   break;
}
}

if (!CreateTransferSocket(transfersocket)) // 建立數據連接
break;

SendTransferinfoNotification(TRANSFERMODE_LIST, physicalDir, logicalDir); // Use TRANSFERMODE_LIST instead of TRANSFERMODE_NLST.
Send(_T("150 Opening data channel for directory list."));

先看一下建立數據連接的代碼:
BOOL CControlSocket::CreateTransferSocket(CTransferSocket *pTransferSocket)
{
...
if (pTransferSocket->Connect(m_transferstatus.ip,m_transferstatus.port)==0)
...
}
無非是常規的socket方法建立連接,需要關注的是由服務主動發起連接,這正是主動模式的含義。我們先看完這一段,再看一下被動模式。

在CreateTransferSocket()完成后,調用:

SendTransferinfoNotification(TRANSFERMODE_LIST, physicalDir, logicalDir);

看一下里面:
void CControlSocket::SendTransferinfoNotification(const char transfermode, const CStdString& physicalFile, const CStdString& logicalFile, __int64 startOffset, __int64 totalSize)
{
t_connop *op = new t_connop;
op->op = USERCONTROL_CONNOP_TRANSFERINIT;
op->userid = m_userid;

t_connectiondata_transferinfo *conndata = new t_connectiondata_transferinfo;
conndata->transferMode = transfermode;
conndata->physicalFile = physicalFile;
conndata->logicalFile = logicalFile;
conndata->startOffset = startOffset;
conndata->totalSize = totalSize;
op->data = conndata;

m_pOwner->SendNotification(FSM_CONNECTIONDATA, (LPARAM)op);
}
可 見發送了一個消息給CServer,wParam參數是FSM_CONNECTIONDATA,表示這是跟connection相關的消息,lParam 帶的參數是USERCONTROL_CONNOP_TRANSFERINIT,表示傳輸開始或結束,我回去看一下CServer中的 OnServerMessage()相關代碼,在admin窗口的下面顯示了將用傳輸的信息。

下面,
Send(_T("150 Opening data channel for directory list."));
發送給FTP客戶端數據連接創建的消息,真正的數據傳輸的任務是交給數據連接了,即CTransferSocket。

我們回到被動模式,如果是被動模式:
if (!m_transferstatus.pasv)
{
...
}
else // 被動模式
{
...
m_transferstatus.socket->PasvTransfer();
}
看一下PasvTransfer()的實現:

void CTransferSocket::PasvTransfer()
{
if(bAccepted)
   if (!m_bStarted)
    InitTransfer(FALSE);
}

非常簡單,由于是被動模式,即由客戶端發起數據連接,因此CTransferSocket只需等待客戶端的連接就可以了,下面分析CTransferSocket的時候再仔細看一下相關的實現。

通過文章完整的描述,大家應該知道了FileZilla 源代碼,希望對大家有幫助!

【編輯推薦】

責任編輯:趙鵬 來源: 網絡轉載
相關推薦

2011-02-23 14:46:21

FileZilla

2011-02-23 14:54:58

FileZilla

2011-02-23 14:16:43

FileZilla

2011-02-23 14:39:27

FileZilla

2011-02-23 14:26:28

FileZilla

2011-02-23 15:11:27

FileZilla

2011-02-23 15:21:06

FileZilla

2011-02-23 13:47:33

FileZilla

2011-02-23 15:26:01

FileZilla

2011-03-01 16:32:58

FileZilla

2011-03-01 16:01:08

FileZilla

2011-03-01 16:19:27

FileZilla

2011-03-01 16:25:37

FileZilla

2015-08-28 09:38:51

Linux源代碼分析工具

2018-05-25 14:16:55

NFS源代碼線程

2011-08-24 15:42:38

LUA源代碼

2015-08-26 17:38:47

Linux源代碼

2009-07-02 13:59:35

JSP后臺

2011-08-24 16:24:54

Lua源代碼

2012-02-20 14:47:08

JavaPlay
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品国产一区二区 | 久久精品国内 | 伊人亚洲| 国产精品久久久久久久久久妇女 | 视频一区 国产精品 | 亚洲成人久久久 | 亚洲精品日韩精品 | 久久一区二区三区电影 | 国产一区二区在线免费播放 | 伊人最新网址 | 午夜男人免费视频 | 久久99精品久久久水蜜桃 | 日韩伦理电影免费在线观看 | av天空| 欧美精品一区二区三区四区 在线 | 国产免费视频 | 国产成人在线播放 | 看一级黄色毛片 | 亚洲成人国产综合 | 97在线超碰 | 免费视频一区二区 | 欧美四虎 | 国产成人jvid在线播放 | 一区二区三区亚洲视频 | 男女一区二区三区 | 国产综合久久 | 久久国产精品免费一区二区三区 | 国产欧美日韩一区 | 亚洲成人一区 | 久久亚洲免费 | 国产aⅴ爽av久久久久久久 | 日韩欧美一区二区三区四区 | 密室大逃脱第六季大神版在线观看 | 久久亚洲欧美日韩精品专区 | 国产亚洲欧美在线视频 | 国产午夜精品视频 | 香蕉久久a毛片 | 午夜爽爽爽男女免费观看影院 | 女同久久另类99精品国产 | 欧美日韩在线精品 | 日韩高清一区 |