//接收完成函数 bool CServerSocketItem::OnRecvCompleted(COverLappedRecv * pOverLappedRecv, DWORD dwThancferred) { //效验数据 ASSERT(m_bRecvIng==true); //设置变量 m_bRecvIng=false; m_dwRecvTickCount=GetTickCount(); //判断关闭 if (m_hSocket==INVALID_SOCKET) { CloseSocket(m_wRountID); return true; } //接收数据 int iRetCode=recv(m_hSocket,(char *)m_cbRecvBuf+m_wRecvSize,sizeof(m_cbRecvBuf)-m_wRecvSize,0); if (iRetCode<=0) { CloseSocket(m_wRountID); return true; } //接收完成 m_wRecvSize+=iRetCode; BYTE cbBuffer[SOCKET_BUFFER]; CMD_Head * pHead=(CMD_Head *)m_cbRecvBuf; //处理数据 try { while (m_wRecvSize>=sizeof(CMD_Head)) { //效验数据 WORD wPacketSize=pHead->CmdInfo.wPacketSize; if (wPacketSize>SOCKET_BUFFER) throw TEXT("数据包超长"); if (wPacketSize<sizeof(CMD_Head)) throw TEXT("数据包非法"); if (pHead->CmdInfo.cbVersion!=SOCKET_VER) throw TEXT("数据包版本错误"); if (m_wRecvSize<wPacketSize) break; //提取数据 CopyMemory(cbBuffer,m_cbRecvBuf,wPacketSize); WORD wRealySize=CrevasseBuffer(cbBuffer,wPacketSize); ASSERT(wRealySize>=sizeof(CMD_Head)); m_dwRecvPacketCount++; //解释数据 WORD wDataSize=wRealySize-sizeof(CMD_Head); void * pDataBuffer=cbBuffer+sizeof(CMD_Head); CMD_Command Command=((CMD_Head *)cbBuffer)->CommandInfo; //内核命令 if (Command.wMainCmdID==MDM_KN_COMMAND) { switch (Command.wSubCmdID) { case SUB_KN_DETECT_SOCKET: //网络检测 { break; } default: throw TEXT("非法命令码"); } } else { //消息处理 m_pIServerSocketItemSink->OnSocketReadEvent(Command,pDataBuffer,wDataSize,this); } //删除缓存数据 m_wRecvSize-=wPacketSize; MoveMemory(m_cbRecvBuf,m_cbRecvBuf+wPacketSize,m_wRecvSize); } } catch (...) { CloseSocket(m_wRountID); return false; } return RecvData(); }
bool CCNetDelegate::runReadByte() { int nRet = m_oSocket.ccRead(m_pReadBuffer + m_wRecvSize, sizeof(m_pReadBuffer) - m_wRecvSize); if( nRet == eSocketIoError || nRet == eSocketIoClosed ) { unregisterScheduler(); m_oSocket.ccClose(); m_eStatus = eSocketIoClosed; onDisconnected(); return true; } else { #if 1 CCLOG("CCSOCKET READ %d", nRet); #endif m_wRecvSize += nRet; BYTE cbDataBuffer[SOCKET_BUFFER+sizeof(CMD_Head)]; WORD wPacketSize = 0; CMD_Head * pHead = (CMD_Head *)m_pReadBuffer; while( m_wRecvSize >= sizeof(CMD_Head) ) { //效验参数 wPacketSize = pHead->CmdInfo.wPacketSize; // ASSERT(pHead->CmdInfo.cbVersion == SOCKET_VER); // ASSERT(wPacketSize <= (SOCKET_BUFFER + sizeof(CMD_Head))); if (pHead->CmdInfo.cbVersion != SOCKET_VER) throw std::string("数据包版本错误"); if (wPacketSize > (SOCKET_BUFFER + sizeof(CMD_Head))) throw std::string("数据包太大"); if (m_wRecvSize < wPacketSize) return 1; //拷贝数据 m_dwRecvPacketCount++; memcpy(cbDataBuffer, m_pReadBuffer, wPacketSize); m_wRecvSize -= wPacketSize; memcpy(m_pReadBuffer, m_pReadBuffer + wPacketSize, m_wRecvSize); //解密数据 WORD wRealySize=CrevasseBuffer(cbDataBuffer,wPacketSize); //解释数据 WORD wDataSize = wRealySize - sizeof(CMD_Head); void * pDataBuffer = cbDataBuffer + sizeof(CMD_Head); CMD_Command Command = ((CMD_Head *)cbDataBuffer)->CommandInfo; //内核命令 if (Command.wMainCmdID == MDM_KN_COMMAND) { switch (Command.wSubCmdID) { case SUB_KN_DETECT_SOCKET: //网络检测 { //发送数据 sendPacket(MDM_KN_COMMAND, SUB_KN_DETECT_SOCKET, pDataBuffer, wDataSize); break; } } continue; } //处理数据 // bool bSuccess = m_pITCPSocketSink->OnEventTCPSocketRead(GetSocketID(), Command, pDataBuffer, wDataSize); // if (bSuccess == false) throw std::string("网络数据包处理失败"); onMessageReceived((const char *)cbDataBuffer, wRealySize); } } return false; }