Bool CAdapterFY::Parser(Msg_t& Msg) { Bool rVal = false; S8* pParsePoint = NULL; S8* pCurPos = NULL; U32 DataLen = 0; U32 PacketLen = 0; Msg.Type = ADP::ADP_CMD_UNKNOW; do { pParsePoint = m_RcvBuf.FindKey("FYMT", sizeof("FYMT")); if (pParsePoint) { pCurPos = pParsePoint; DataLen = m_RcvBuf.GetDataLen(); if (DataLen < (sizeof(MsgHead_t))) { break; } PacketLen = GetPackLen(pParsePoint); if (DataLen < PacketLen) { break; } if (!m_RcvBuf.CheckDataLen(PacketLen)) { rVal = true; pCurPos++; break; } if (MW_SUCC != DoData(pParsePoint, Msg)) { pCurPos = pParsePoint + 1; } else { pCurPos = pParsePoint + PacketLen; } rVal = true; } } while(0); m_RcvBuf.SetParsePos(pCurPos); return rVal; }
void* CRingBuffer::GetPack(DWORD& dwDateSize) { dwDateSize = 0; m_pLeft = m_pNext; char* pLeft = m_pLeft; char* pRight = m_pRight; dwDateSize = GetPackLen(pLeft, pRight); DWORD dwRemainDataLen = 0; if ( pLeft <= pRight ) dwRemainDataLen = pRight - pLeft; else dwRemainDataLen = m_dwBufferLen - (pLeft - pRight); // 剩余数据的长度小于数据头所记录的长度 if ( dwRemainDataLen < dwDateSize + PACK_HEADER_SIZE ) { dwDateSize = 0; return NULL; } DWORD dwRemainLeft2End = m_dwBufferLen - (m_pLeft - m_pStart); // 数据环绕 if ( pLeft > pRight && dwRemainLeft2End < dwDateSize + PACK_HEADER_SIZE ) { memcpy(m_pTemp, pLeft, dwRemainLeft2End); memcpy(m_pTemp + dwRemainLeft2End, m_pStart, dwDateSize + PACK_HEADER_SIZE - dwRemainLeft2End); m_pNext = m_pStart + dwDateSize + PACK_HEADER_SIZE - dwRemainLeft2End; return m_pTemp + PACK_HEADER_SIZE; } m_pNext = pLeft + dwDateSize + PACK_HEADER_SIZE; return pLeft + PACK_HEADER_SIZE; }
BOOL BSNetPack::SplitPack(BYTE* recvBuffer, UINT nRecvLen, UINT& nSavedLen) { BSAutoLock lock(&m_mutexBuffer); //TRACE("IntoSplitPack:%X len:%X\n:", *recvBuffer, nRecvLen); // 遍历RecvBuffer for (UINT i=0;i<nRecvLen;) { // 未取得当前包长度时 if (!IsHeaderFinished()) { // 计算包头长度 UINT nRealHeaderLen = GetHeaderLen(); // 当未收够包头长度时 if (ReceivedLen < nRealHeaderLen) { int tempcopylen = nRealHeaderLen - ReceivedLen; if (nRecvLen-i<tempcopylen) { tempcopylen=nRecvLen-i; SaveToBuffer((recvBuffer+i), tempcopylen); i+=tempcopylen; continue; } SaveToBuffer((recvBuffer+i), tempcopylen); i+=tempcopylen; } // 获取包长度(包括包头和包内容) ParsePackLen(); //TRACE("TotalLen:%d\n", nLen); } if ( GetPackLen() < GetHeaderLen()) { // pack len Error Handling ASSERT(FALSE); TRACE("ErrorPackLen:%d%X, len:%d\n", *(BYTE*)(Buffer), GetPackLen()); BSLogger::SysLog(LOG_ERROR, "报文长度不正确 %u", GetPackLen()); ClearBuffer(); return FALSE; break; } // 本次分包报文在当前recv到的buffer里可以读取的长度 int nPackThisRead = (nRecvLen-i) < (PackLen-ReceivedLen) ? (nRecvLen-i) : (PackLen-ReceivedLen); //TRACE("PackThisRead:%d\n", nPackThisRead); if(PackLen>MaxBufferLen || ReceivedLen+nPackThisRead>MaxBufferLen) { // pack len too big, drop it. ASSERT(FALSE); i += nPackThisRead; TRACE("DropTooBigPack:%X, len:%d\n", *(BYTE*)(Buffer), PackLen); BSLogger::SysLog(LOG_ERROR, "报文长度过大 %u", PackLen); ClearBuffer(); return FALSE; break; } SaveToBuffer(recvBuffer+i, nPackThisRead); i += nPackThisRead; nSavedLen = i; // 收到一个完整报文 if (IsPackFinished()) { return TRUE; } } return TRUE; };