码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-01-23 18:29:10      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

  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对象中的要被提取的子串的第一个字符的从零开始的索引。

 

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

标签:

原文地址:http://www.cnblogs.com/kanite/p/5153637.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!