Exemplo n.º 1
0
void RPCClientTransportLayer::recv(std::string &outBuf) throw(ServiceException)
{
	SFPacket* pPacket = NULL;

	DWORD dwCurrentTime = GetTickCount();
	DWORD dwLastTime = dwCurrentTime;

	while (pPacket == NULL)
	{
		pPacket = (SFPacket*)SFNetworkEntry::GetInstance()->GetTCPNetwork()->GetRPCResult();

		//if (dwLastTime - dwCurrentTime > 5000)
			//break;

		//dwLastTime = GetTickCount();

		Sleep(1);
	}

	if (pPacket != NULL)
	{
		int size = pPacket->GetDataSize();
		outBuf.append((const char*)pPacket->GetData(), pPacket->GetDataSize());
		SFEngine::GetInstance()->ReleasePacket(pPacket);
	}
}
Exemplo n.º 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;
}