FileZilla FTP服务器源代码分析13
来源:互联网 发布:一致性哈希算法 java 编辑:程序博客网 时间:2024/05/19 18:10
FileZilla FTP服务器源代码分析13
前面已经分析过了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的时候再仔细看一下相关的实现。
<script type="text/javascript"><!--google_ad_client = "pub-1534216445189830";google_alternate_ad_url = "http://www.fish888.com/noad.html";google_ad_width = 728;google_ad_height = 90;google_ad_format = "728x90_as";google_ad_type = "text_image";google_ad_channel ="";google_color_border = "FFFFFF";google_color_link = "0000FF";google_color_bg = "FFFFFF";google_color_text = "000000";google_color_url = "008000";//--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>- FileZilla FTP服务器源代码分析13
- FileZilla FTP服务器源代码分析13
- FileZilla FTP服务器源代码分析
- FileZilla FTP服务器源代码分析
- FileZilla FTP服务器源代码分析1
- FileZilla FTP服务器源代码分析04
- FileZilla FTP服务器源代码分析05
- FileZilla FTP服务器源代码分析06
- FileZilla FTP服务器源代码分析07
- FileZilla FTP服务器源代码分析09
- FileZilla FTP服务器源代码分析10
- FileZilla FTP服务器源代码分析11
- FileZilla FTP服务器源代码分析12
- FileZilla FTP服务器源代码分析06
- FileZilla FTP服务器源代码分析07
- FileZilla FTP服务器源代码分析09
- FileZilla FTP服务器源代码分析10
- FileZilla FTP服务器源代码分析11
- FileZilla FTP服务器源代码分析12
- ADT
- [转]浮点数表示及其实现
- 在Updatepanel中使用JS的问题.
- LNK2005“符号已定义”错误解决方法
- FileZilla FTP服务器源代码分析13
- 选择屏幕-实现页签选择的效果
- TreeView的ImageSet属性设置断线的问题
- AJAX应用之注册用户即时检测
- IT杂感
- Apache虚拟主机示例
- 软件项目管理的成功原则
- access2007下获得上个月的全部数据的sql语句
- 網頁彈出框架信息