FileZilla FTP服务器源代码分析11

FTP客户通过ftp localhost命令与FileZilla服务器建立socket连接后,FileZilla Server显示了welcome信息,这时屏幕上显示类似(我们以windows下的ftp命令作为sample):

Connected to dell.
220-FileZilla Server version 0.9.18 beta
220-written by Tim Kosse (Tim.Kosse@gmx.de)
220 Please visit http://sourceforge.net/projects/filezilla/
User (dell:(none)):

提示输入用户名,假设这时用户输入whg,回车,这时ftp客户端会将这用户输入的字符翻译成标准的FTP命令"USER whg"发送到服务器,因为这时是CControlSocket对这个socket进行监听,并且recv相关的事件通过前面提到的分发机制,最终分发到 CControlSocket的OnReceive方法,下面我看一下这个方法:

m_antiHammeringWaitTime还不知是起什么作用,在对源代码进行跟踪的时候,其刚开始的值是0,因此先跳过这个。

下段是获得传输速度限制SpeedLimit,如果没有限制,则为-1。

再往下:
 int numread = Receive(buffer, len); // 调用recv来获得socket数据,取长度为len的数据放到buffer中
 
读取成功后,将buffer中的接收到的数据一个字节一个字节放到m_RecvBuffer中:
 m_RecvBuffer[m_nRecvBufferPos++] = buffer[i];

然后将将刚才收到的m_RecvBuffer放入m_RecvLineBuffer:
 m_RecvLineBuffer.push_back(m_RecvBuffer);
 
m_RecvLineBuffer 相当于一个命令池,里面存放着用户发送来,但还没有处理的命令。

最后当这个recv处理完后,调用ParseCommand()来解释这个命令。

首先通过GetCommand()取出m_RecvLineBuffer中最前面的命令,并解释成命令command,以及参数args,如刚才的命令USER whg就被解释成command=USER, args=whg

下面的循环:
 for (int i = 0; i < (sizeof(commands)/sizeof(t_command)); i++)
通过在预先定义的FTP Server所有命令commands中,查找是否包含command,从而校验刚才收到的命令的合法性,如果command不在commands中,显示command是非法命令,这时发送客户端
 Send(_T("500 Syntax error, command unrecognized."));

即使命令是合法的,但如果参数不对(bHasargs指定这个命令是否需要参数),即有些命令必须带参数,而args没有,这时会发送:
 Send(_T("501 Syntax error"));
下面:
 if (!m_RecvLineBuffer.empty())
  m_pOwner->PostThreadMessage(WM_FILEZILLA_THREADMSG, FTM_COMMAND, m_userid);
表示如果命令缓冲区中还有未处理的命令,则发送消息给 CServerThread,CServerThread在方法OnThreadMessage中处理这个消息:
 else if (wParam==FTM_COMMAND)
 { //Process a command sent from a client
  CControlSocket *socket=GetControlSocket(lParam);
  if (socket)
   socket->ParseCommand();
 }
在 GetControlSocket()方法中:
CControlSocket * CServerThread::GetControlSocket(int userid)
{
 CControlSocket *ret=0;
 EnterCritSection(m_threadsync);
 // 下面这个map是user -> CControlSocket,即通过userid找到服务这个userid的CControlSocket
 std::map<int, CControlSocket *>::iterator iter=m_LocalUserIDs.find(userid);
 if (iter!=m_LocalUserIDs.end())
  ret=iter->second;
 LeaveCritSection(m_threadsync);
 return ret;
}

可见,发送这个消息的作用是让CControlSocket继续调用ParseCommand()来处理下一个命令。


回到最初的ParseCommand(),如果命令参数也没有问题,下面检查这个命令是否必须先登录再使用(由 bValidBeforeLogon指定),比如:get命令是必须先登录的,而USER命令不用,如果必须先登录,发送:
 Send(_T("530 Please log in with USER and PASS first."));
下面同样
 m_pOwner->PostThreadMessage(WM_FILEZILLA_THREADMSG, FTM_COMMAND, m_userid);

命令都合格的话,下面:
 switch (nCommandID)
来处理不同的命令,由于这时是COMMAND_USER命令,我们看一下处理过程:
经过一些处理后,下面发送
 Send(_T("331 Password required for ") + args);
要求用户输入密码,时客户端屏幕上会显示:
331 Password required for whg
Password:

用户输入密码后,回车,这时ftp客户端会翻译成标准的FTP命令"PASS 123456"发送到服务器,我们看一下ParseCommand()对这的处理:
 case COMMAND_PASS:
  else if (DoUserLogin(args))
   Send(_T("230 Logged on"));
在 DoUserLogin()认定成功登录后,发送成功登录消息给客户端,否则会发送错误消息:
 Send(_T("530 Login or password incorrect!"));
 
仔细看一下CPermissions::CheckUserLogin(),会发现密码是经过MD5加密的,并且在CServerThread创建时,跟权限相关的成员变量就初始化了:
m_pPermissions = new CPermissions;

在CPermissions::Init()中,调用ReadSettings(),从配置文件中,将所有的用户信息(包括密码)都读到内存了,因此刚才的密码校验只是内存中的字符串比对。

用户成功登录后,FTP客户端显示:

C:\Documents and Settings\Administrator>ftp localhost
Connected to dell.
220-FileZilla Server version 0.9.18 beta
220-written by Tim Kosse (Tim.Kosse@gmx.de)
220 Please visit http://sourceforge.net/projects/filezilla/
User (dell:(none)): whg
331 Password required for whg
Password:
230 Logged on
ftp>

下面FTP服务器等待新的FTP命令了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
今天小编要给大家介绍一款专业好用的FTP客户端软件——FilezillaFilezilla采用开源并免费的方式,实现功能强大、高安全、高性能的FTP客户端、服务器端功能。可控性、有条理的界面和管理多站点的简化方式也是其显著的优点。软件界面美观简洁、简单全面、实用方便,无需培训,即可快速上手,轻轻松松完成日常FTP客户端功能,真正做到简单全面实用。是用户实现FTP客户端功能的好帮手。需要的朋友快来下载吧! Filezilla怎么用之安装步骤   把下载好的安装包解压到当前文件夹,之后双击打开Filezilla_service.exe运行文件进行安装,打开的时候会出现下载框,可能是最新的版本吧,我们不要管它,点击下一步“Next”即可。     这里有告诉我们点击“Accept”  表示同意安装MyPC backUP ,那么点击Accept 即可。 下一步还是Accept(这里是协议,英文的我就不截图了,大家自己安装的时候能看到。)     You SoftWare IS downloading表示文件正在下载,进度完成100%就好了,我们就可以安装文件。     下载完成,Install  Now  现在开始安装,点击它就可以进入正题的安装界面了。     软件的用户协议,I agree 我同意进入下一步操作。下一步的操作是选择需要安装的组件,选择默认即可。点击下一步,安装路径,不用管他,点击下一步(如果不想安装在C盘的话,就直接把C换成D);     此步骤是询问我们是否要让FTP伺服器在电脑开机时自动启动,请点选【Install as service, started with Windows (default)】,再按一下〔Next〕。这样FTP伺服器便会自动被安装成系统的Service,每次开机后便会自动再背景中启动并执行FTP伺服 器的功能。设置管理端口“14147”,强烈推荐修改此端口,例如:改成38121端口。(注意不要和常见服务如80端口冲突)   接着我们可以设定是否在开机时自动启动「FileZilla Server Interface」伺服器管理介面,如果你常常需要管理你的FTP伺服器,可以选【Start if user logs on, apply only to current user】。一般来说都是选最下面的【Start manually】,要用时再手动开启即可。 Filezilla怎么用之软件配置   安装好软体后,启动FileZilla伺服器时,会出现一个「 Connect to Server」视窗,我们可以在「Administrator password:」栏位中输入本服务器Filezilla服务的密码,输入管理端口号(管理端口到底是多少,请参考前文安装过程中填写的具体数字是多 少。),然后勾选「Always connect to this server」再按下〔OK〕。建议选中“总是连接到本服务器”的选项,即表示每次启动管理控制台,都是管理本机的Filezilla服务。 注意:修改端口和密码非常重要,这是确保Filezilla安全的重点,必须修改端口,必须设置密码!密码建议足够复杂!可以在管理界面中进行修改。     出现FileZilla伺服器管理介面后,我们可以在视窗上半部看到目前的FTP伺服器的运作状况,如果有出现「Logged on」或「Server online」的字样,表示已经FileZilla顺利上线。我们可以随时点按上方的闪电图示切换上线、离线,即可手动开启或关闭FTP站。 Filezilla怎么用之软件卸载 依次选择开始-> 所有程序 -> FileZilla Server ->Uninstall 或者依次打开我的电脑->卸载或更改程序->卸载你所卸载的软件,您可以用 Window XP控制面板中的添加或删除程序功能,或用 Windows Vista、Windows 7中的程序和功能删除FileZilla Server, 然后点击开始卸载。   FileZilla的主要特点 自定义欢迎消息,可选择是否显示软件版本 上传下载速度限制,并可以限定某个特定的时间段的速度 组设置及用户设置新增封闭IP和允许特定IP访问的功能 支持将日志写入文件,并可定义是否在日志中显示密码和欢迎消息 支持虚拟目录,可以映射不同的盘符的文件到根目录下 可以限制总用户数、单个IP连接数,不同用户可以设置不同的用户数限定以及不同的速度限制,也可以应用组设置!(开源软件)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值