예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
파일: Net.cpp 프로젝트: Angryn00b/vnoc
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;
}
예제 #4
0
파일: Net.cpp 프로젝트: Angryn00b/vnoc
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);
	}
}
예제 #5
0
파일: Net.cpp 프로젝트: Angryn00b/vnoc
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);
	}
}
예제 #6
0
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;
}