VC FTP服务器程序分析(三)

  CControlSocket类的分析,CControlSocket类的内容比较多,为什么呢。因为通信控制命令的传输全部在这里,通信协议的多样也导致了协议解析的多样。

  1、OnReceive  其大致说明:本函数由框架调用,通知套接字缓冲中有数据,可以调用Receive函数取出。

 1 void CControlSocket::OnReceive(int nErrorCode)
 2 {
 3     try
 4     {
 5         TCHAR buff[BUFFER_SIZE+1];
 6
 7         int nRead = Receive(buff, BUFFER_SIZE);
 8         switch (nRead)
 9         {
10             case 0:
11                 Close();
12                 break;
13
14             case SOCKET_ERROR:
15                 if (GetLastError() != WSAEWOULDBLOCK)
16                 {
17                     TCHAR szError[256];
18                     wsprintf(szError, "OnReceive error: %d", GetLastError());
19                     AfxMessageBox (szError);
20                 }
21                 break;
22
23             default:
24                 if ((m_RxBuffer.GetLength() + nRead) > BUFFER_OVERFLOW)
25                 {
26                     ((CClientThread *)m_pThread)->PostStatusMessage("Buffer overflow: DOS attack?");
27
28                     // buffer overflow (DOS attack ?)
29                     AfxGetThread()->PostThreadMessage(WM_QUIT,0,0);
30                 }
31                 else
32                 if (nRead != SOCKET_ERROR && nRead != 0)
33                 {
34                     // terminate the string
35                     buff[nRead] = 0;
36                     m_RxBuffer += CString(buff);
37
38                     GetCommandLine();
39                 }
40                 break;
41         }
42     }
43     catch(...)
44     {
45         // something bad happened... (DOS attack?)
46         ((CClientThread *)m_pThread)->PostStatusMessage("Exception occurred in CSocket::OnReceive()!");
47         // close the connection.
48         AfxGetThread()->PostThreadMessage(WM_QUIT,0,0);
49     }
50     CSocket::OnReceive(nErrorCode);
51 }

  这个函数就是读控制命令套接字及相应的错误处理。接收到的数据,保存在了m_RxBuffer中。接下来GetCommandLine函数解析接收到的数据。

  2、GetCommandLine函数 解析命令数据

 1 void CControlSocket::GetCommandLine()
 2 {
 3     CString strTemp;
 4     int nIndex;
 5
 6     while(!m_RxBuffer.IsEmpty())                //有接收到的数据待处理
 7     {
 8         nIndex = m_RxBuffer.Find("\r\n");       //找一条完整的命令的结束符
 9         if (nIndex != -1)
10         {
11             strTemp = m_RxBuffer.Left(nIndex);  //将这条命令提取出来
12             m_RxBuffer = m_RxBuffer.Mid(nIndex + 2); //更新m_RxBuffer 去掉已经提取出来的命令
13             if (!strTemp.IsEmpty())
14             {
15                 m_strCommands.AddTail(strTemp); //可能while循环中提取出多条命令,这里增加一个队列
16                 // parse and execute command
17                 ProcessCommand();               //去处理这些命令,如果直接处理命令的话,就没有上面m_strCommandsz这个队列缓冲了
18             }
19         }
20         else
21             break;
22     }
23 }

  该有的解释已经在上面了。CString::Mid的函数与我记忆中的可能有些差别,特意查询下。CString CString ::Mid(int nFirst) const

  返回值:返回一个包含指定范围字符的拷贝的CString对象。nFirst 此CString对象中的要被提取的子串的第一个字符的从零开始的索引。

时间: 2025-01-19 20:27:07

VC FTP服务器程序分析(三)的相关文章

VC FTP服务器程序分析(二)

上面讲到了CClientThread类,打开这个类的实现,这个类实现了4个函数.依次分析: 1.InitInstance   其说明如下:InitInstance必须被重载以初始化每个用户界面线程的新实例.统称,你重载InitInstance函数来执行当线程首次被创建时必须完成的任务.此成员函数仅在用户界面线程中使用. 1 BOOL CClientThread::InitInstance() 2 { 3 // Attach the socket handle to a CSocket objec

VC FTP服务器程序分析(四)

下面是数据传输的重点-CDataSocket类,函数不多,都比较重要. 1.OnAccept  数据tcp服务器被连接的虚函数,由框架调用. 1 void CDataSocket::OnAccept(int nErrorCode) 2 { 3 // Accept the connection using a temp CSocket object. 4 CAsyncSocket tmpSocket; 5 Accept(tmpSocket); 6 7 SOCKET socket = tmpSock

ftp服务器搭建及三种访问途径

FTP服务器搭建与三种访问途径一.什么是FTP二.FTP是如何搭建的三.FTP访问途径是哪三种1.FTP是一种文件传输协议,主要要的做用是客户端与服务器之间的文件传输功能实现2.FTP服务器是如何搭建的呢A.此处服务器我们在server2016上搭建,具体步骤如下:打开服务器管理器→添加角色和功能→web服务器(IIS)→角色服务(FTP服务器)→安装到这一步我们的FTP服务器算是安装好了B.FTP功能的实现有两种方式1.ip地址(这种方式一个ip地址只能搭建一个FTP服务器)具体步骤如下:Wi

通过IIS设置架设FTP服务器程序步骤

FTP服务器在文件的传输上性能稳定,占用系统资源小,而且传输速度快,现在网上已经有很多的FTP服务器可供使用,而微软IIS强大的功能,除了提供WWW服务之外,还提供FTP的服务,利用它就可以很容易架设一个功能卓越的FTP服务器.下面介绍通过设置IIS来架设FTP服务器的几个步骤.    第一步:启动IIS及FTP服务.在默认情况下,FTP服务器已搭建好,并可立即登录,但FTP中是空的,没有文件.    第二步:通过IIS默认FTP站点-属性,调出对话框,选择“主目录”的标签,在“本地路径”填写共

魔兽世界服务器Trinitycore分析三:auth server网络事件的处理

authserver在初始化静态变量时,会调用AuthSession::InitHandlers(),初始化全局的业务哈希表Handlers: std::unordered_map<uint8, AuthHandler> AuthSession::InitHandlers() { std::unordered_map<uint8, AuthHandler> handlers; handlers[AUTH_LOGON_CHALLENGE] = { STATUS_CONNECTED,

魔兽世界服务器Trinitycore分析三:日志模块

一:日志接口 TrinityCore的日志有六个级别:Trace,Debug,Info,Warn,Error,Fatal 它们分别对应以下这六个接口,(filterType__也是在配置文件中指定的) #define TC_LOG_TRACE(filterType__, ...) #define TC_LOG_DEBUG(filterType__, ...) #define TC_LOG_INFO(filterType__, ...) #define TC_LOG_WARN(filterType

使用事件驱动模型实现高效稳定的网络服务器程序

使用事件驱动模型实现高效稳定的网络服务器程序 几种网络服务器模型的介绍与比较 围绕如何构建一个高效稳定的网络服务器程序,本文从一个最简单的服务器模型开始,依次介绍了使用多线程的服务器模型.使用非阻塞接口的服务器模型.利用select()接口实现的基于事件驱动的服务器模型,和使用libev事件驱动库的服务器模型.通过比较各个模型,得出事件驱动模型更适合构建高效稳定的网络服务器程序的结论. 前言 事件驱动为广大的程序员所熟悉,其最为人津津乐道的是在图形化界面编程中的应用:事实上,在网络编程中事件驱动

搭建ftp服务器实现文件共享

FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务. FTP(File Transfer Protocol: 文件传输协议)作用: Internet 上用来传送文件的协议. 常见FTP服务器: windows:Serv-U FTP Server Linux:ProFTPD:(Professional FTP daemon)一个Unix平台上或是类Unix平台上(如Linux, FreeBSD等)的FTP

安装FTP服务器详解

一.简介 FTP是文件传输协议,正是由于这种协议使得主机间可以共享文件. FTP 使用TCP生成一个虚拟连接用于控制信息,然后再生成一个单独的 TCP 连接用于数据传输. vsftpd是一款在Linux发行版中最主流的FTP服务器程序:特点是小巧轻快,安全易用: 二.安装 [[email protected] ~]# rpm -qa | grep ftp [[email protected] ~]# yum list | grep ftp ftp.x86_64