标签:
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对象中的要被提取的子串的第一个字符的从零开始的索引。
标签:
原文地址:http://www.cnblogs.com/kanite/p/5153637.html