BasePacket* SFCGSFPacketProtocol::GetPacket(int& errorCode)
{
	SFPacket* pPacket = SFPacketPool::GetInstance()->Alloc();

	pPacket->Initialize();

	if (FALSE == m_pPacketIOBuffer->GetPacket(*pPacket->GetHeader(), (char*)pPacket->GetData(), m_packetSize, errorCode))
	{
		SFPacketPool::GetInstance()->Release(pPacket);
		return nullptr;
	}

	if (FALSE == pPacket->Decode(m_packetSize, errorCode))
	{
		SFPacketPool::GetInstance()->Release(pPacket);
		return nullptr;
	}

	return pPacket;
}
示例#2
0
BasePacket* SFDefaultPacketProtocol::GetPacket(int& ErrorCode)
{
	SFPacket* pPacket = PacketPoolSingleton::instance()->Alloc();
	pPacket->Initialize();

	if(FALSE == m_pPacketIOBuffer->GetPacket(pPacket, ErrorCode))
	{
		PacketPoolSingleton::instance()->Release(pPacket);
		return NULL;
	}

	SFPacketHeader* pHeader = pPacket->GetHeader();

	if(TRUE == pHeader->CheckDataCRC())
	{
		DWORD dwDataCRC = 0;
		
		BOOL Result = SFPacket::GetDataCRC((BYTE*)pPacket->GetDataBuffer(), pHeader->PacketLen - sizeof(SFPacketHeader), dwDataCRC);

		if(TRUE != Result || pHeader->DataCRC != dwDataCRC)
		{
			//SFLOG_WARN(L"Packet CRC Check Fail!! %d %d", pHeader->DataCRC, dwDataCRC);

			ErrorCode = PACKETIO_ERROR_DATA_CRC;
			PacketPoolSingleton::instance()->Release(pPacket);

			return NULL;
		}
	}

	if (TRUE == pHeader->CheckEncryption())
	{	
		if(FALSE == SFEncrytion<SFEncryptionXOR>::Decrypt((BYTE*)pPacket->GetDataBuffer(), pHeader->PacketLen - sizeof(SFPacketHeader)))
		{
			SFASSERT(0);
			PacketPoolSingleton::instance()->Release(pPacket);
			ErrorCode = PACKETIO_ERROR_DATA_ENCRYPTION;
			return FALSE;
		}
	}

	if(TRUE == pHeader->CheckCompressed())
	{
		BYTE pSrcBuf[MAX_PACKET_DATA] = {0,};
		int DestSize = MAX_PACKET_DATA;

		memcpy(pSrcBuf, pPacket->GetDataBuffer(), pPacket->GetDataSize());
		pPacket->ResetDataBuffer();

		if(FALSE == SFCompressor<SFCompressLzf>::GetCompressor()->Uncompress(pPacket->GetDataBuffer(), DestSize, pSrcBuf, pPacket->GetDataSize()))
		{
			//SFLOG_WARN(L"Packet Uncompress Fail!! %d %d", pHeader->DataCRC, dwDataCRC);

			PacketPoolSingleton::instance()->Release(pPacket);
			ErrorCode = PACKETIO_ERROR_DATA_COMPRESS;

			return FALSE;
		}

		pHeader->PacketLen = DestSize + sizeof(SFPacketHeader);
	}

	return pPacket;
}