bool SFCGSFPacketProtocol::Encode(BasePacket* pPacket, char** ppBuffer, int& bufferSize)
{
	SFPacket* pSFPacket = (SFPacket*)pPacket;
	
	if (false == pSFPacket->Encode(m_packetSize, m_packetOption))
		return false;

	*ppBuffer = (char*)pSFPacket->GetHeader();
	bufferSize = pSFPacket->GetPacketSize();

	return true;
}
示例#2
0
void ProtocolSocket::OnRawData(const char *buf, size_t len)
{
    m_pIOBuffer->AppendData(buf, len);

    SFPacket packet;
    int errorCode = 0;

    if (false == GetPacket(&packet, errorCode))
        return;

    if (packet.GetHeader()->packetID == PACKET_SAMPLE1)
    {
        static_cast<ProtocolHandler&>(Handler()).OnSample1(this, &packet);
    }
}
示例#3
0
void PacketSendThread(void* Args)
{
	SFEngine* pEngine = (SFEngine*)Args;
	INetworkEngine* pNetworkEngine = pEngine->GetNetworkEngine();

	while (SFEngine::GetInstance()->ServerTerminated() == FALSE)
	{
		SFPacket* pPacket = (SFPacket*)PacketSendSingleton::instance()->PopPacket();

		if (SFPACKET_SERVERSHUTDOWN == pPacket->GetPacketType())
			break;

		pNetworkEngine->SendInternal(pPacket->GetOwnerSerial(), (char*)pPacket->GetHeader(), pPacket->GetPacketSize());
		PacketPoolSingleton::instance()->Release(pPacket);
	}
}
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;
}
示例#5
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;
}