18,356
社区成员
发帖
与我相关
我的任务
分享
BOOL SSocket::OnReceive(int nError)
{
if( TSOCKET_SUCCESS != nError ) return FALSE;
//-----------------------------------------------------------------
// 数据包头还未满
//-----------------------------------------------------------------
if (m_nRecvBufLen<sizeof(QHEADER)) return FALSE;
PQHEADER pHeader=(PQHEADER)m_pRecvBuf;
int nMsgLen = HEADER_LENGTH + pHeader->dwLength;
//-----------------------------------------------------------------
// 完整的数据包还未到达
//-----------------------------------------------------------------
if ( m_nRecvBufLen < nMsgLen ) return FALSE;
void *pTmp = malloc(nMsgLen);
memcpy(pTmp, m_pRecvBuf, nMsgLen);
TSOCKET_EVENT *event = new TSOCKET_EVENT;
event->eventType = TEVENT_RECEIVE;
event->errCode = nError;
event->pSocket = this;
event->pMsg = pTmp;
// 看看是否是加密包,如果是加密包,那么还要解密
if( SID_ENCRYPT == ( QID_ENCRYPT & pHeader->dwType ) )
{ // 加密的消息
m_pManager->RC5_DecryptMessage( pTmp ) ; // 解密
}
EnterCriticalSection(&m_pManager->m_cs);
m_pManager->m_queueMsgs.AddTail(event);
LeaveCriticalSection(&m_pManager->m_cs);
//OnMsg(pHeader);
//-----------------------------------------------------------------
// 剩下的是下一个要处理数据包的数据
//-----------------------------------------------------------------
m_nRecvBufLen -= nMsgLen;
memmove( m_pRecvBuf, m_pRecvBuf + nMsgLen, m_nRecvBufLen);
return TRUE;
}