示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
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;
};