MsgStatus CMessage2Parser::_ParserHead(CMessage* pMsg, const CBufferMessage& pBuf) { uint8* pData = pBuf.GetBuffer(); uint8 NumByte[4] = {0}; if (!pData) { return MsgStatus_Err; } for (int index = 0; index < MSG_CLASS_LEN; index++) { NumByte[index] = pData[MSG_PACKSIZE_INDEX + index]; } if (pBuf.GetSize() != _ByteToInt(NumByte)) { return MsgStatus_Err; } memset(NumByte,0,4); for (int index = 0; index < MSG_CLASS_COMMAND; index++) { NumByte[index] = pData[MSG_COMMAND_INDEX + index]; } m_MsgId = _ByteToInt(NumByte); return MsgStatus_Ok; }
MsgStatus CMessage2Parser::_ParserTail(CMessage* pMsg, const CBufferMessage& pBuf) { uint8* pData = pBuf.GetBuffer(); if (pData[CMessage2Parser::GetMessageLen(pBuf.GetBuffer(), pBuf.GetSize()) - 1] != MSG_END) { return MsgStatus_Err; } return MsgStatus_Ok; }
ResultCode CNetCenter::SendServer( const CMessage &helper ) { if (!m_isConnected) { _ConnectServer(); } CMessage2Pack packer; int len; packer.GetPackSize(&helper, len); CBufferMessage buffer; buffer.Alloc(len); packer.PackMessage(&helper, buffer); m_serverSocket.Send(buffer.GetBuffer(),len); return Result_Success; }
void CNetCenter::OnReceive( int nErrorCode,CAsyncSocketEx* pSock ) { Global->PtrAssert(pSock); CBufferMessage buffer; buffer.Alloc(1024); int length = pSock->Receive(buffer.GetBuffer(),1024); Global->Logf(LogFile_Net,_T("OnReceive, size:%d\n"),length); CMessage2Parser parser; CMessage msg(parser.GetMsgType(buffer)); if (parser.Parser(&msg, buffer) == MsgStatus_Ok) { _DispatchMessage(msg); } }
void CNetCenter::OnPackReady(const CBufferMessage &buffer ) { Global->Logf(LogFile_Net,_T("OnPackReady, size:%d\n"),buffer.GetSize()); CMessage2Parser parser; CMessage msg(parser.GetMsgType(buffer)); if(parser.Parser(&msg, buffer) == MsgStatus_Ok) { _DispatchMessage(msg); } }
MsgStatus CMessage2Parser::_ParserParam( CMessage* pMsg, const CBufferMessage& pBuf ) { uint8* pData = pBuf.GetBuffer(); int nParserIndex = MSG_HEAD_LEN; std::string strParam; int ArrSize = 0; std::vector<std::string> vecStrParam; std::vector<uint8> vecUint8Param; std::vector<uint16> vecUint16Param; std::vector<uint32> vecUint32Param; ArrayData* pArrData = NULL; uint8 NumByte[4] = {0}; for (auto It = pMsg->PortBegin(); It != pMsg->PortEnd(); It++) { pArrData = new ArrayData; switch (It->second.first) { case MsgDataMType_Data: switch (It->second.second) { case MsgDataType_String: for (int index = 0; index < sizeof(uint32); index++) { NumByte[index] = pData[nParserIndex]; nParserIndex++; } for (int index = 0; index < _ByteToInt(NumByte); index++) { if ((_ByteToInt(NumByte) == 1) && (pData[nParserIndex] == 0)) { nParserIndex++; break; } strParam.push_back(pData[nParserIndex]); nParserIndex++; } pMsg->Write(It->first, new StringData(strParam)); strParam.clear(); memset(NumByte, 0, 4); break; case MsgDataType_Uint8: pMsg->Write(It->first, new NumData<uint8>(pData[nParserIndex])); nParserIndex++; break; case MsgDataType_Uint16: for (int index = 0; index < sizeof(uint16); index++) { NumByte[index] = pData[nParserIndex]; nParserIndex++; } pMsg->Write(It->first, new NumData<uint16>(_ByteToInt(NumByte))); memset(NumByte, 0, 4); break; case MsgDataType_Uint32: for (int index = 0; index < sizeof(uint32); index++) { NumByte[index] = pData[nParserIndex]; nParserIndex++; } pMsg->Write(It->first, new NumData<uint32>(_ByteToInt(NumByte))); memset(NumByte, 0, 4); break; } break; case MsgDataMType_List: for (int index = 0; index < sizeof(uint32); index++) { NumByte[index] = pData[nParserIndex]; nParserIndex++; } ArrSize = _ByteToInt(NumByte); memset(NumByte, 0, 4); for (int index = 0; index < ArrSize; index++) { if (It->second.second == MsgDataType_String) { for (int index = 0; index < sizeof(uint32); index++) { NumByte[index] = pData[nParserIndex]; nParserIndex++; } for (int index = 0; index < _ByteToInt(NumByte); index++) { if ((_ByteToInt(NumByte) == 1) && (pData[nParserIndex] == 0)) { nParserIndex++; break; } strParam.push_back(pData[nParserIndex]); nParserIndex++; } vecStrParam.push_back(strParam); strParam.clear(); memset(NumByte, 0, 4); } else if (It->second.second == MsgDataType_Uint8) { vecUint8Param.push_back(pData[nParserIndex]); nParserIndex++; } else if (It->second.second == MsgDataType_Uint16) { for (int index = 0; index < sizeof(uint16); index++) { NumByte[index] = pData[nParserIndex]; nParserIndex++; } vecUint16Param.push_back(_ByteToInt(NumByte)); memset(NumByte, 0, 4); } else if (It->second.second == MsgDataType_Uint32) { for (int index = 0; index < sizeof(uint32); index++) { NumByte[index] = pData[nParserIndex]; nParserIndex++; } vecUint32Param.push_back(_ByteToInt(NumByte)); memset(NumByte, 0, 4); } } if (!vecStrParam.empty()) { pArrData->Push(vecStrParam); vecStrParam.clear(); } if (!vecUint8Param.empty()) { pArrData->Push(vecUint8Param); vecUint8Param.clear(); } if (!vecUint16Param.empty()) { pArrData->Push(vecUint16Param); vecUint16Param.clear(); } if (!vecUint32Param.empty()) { pArrData->Push(vecUint32Param); vecUint32Param.clear(); } pMsg->WriteArr(It->first, pArrData); break; default: return MsgStatus_Err; } } return MsgStatus_Ok; }