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; }
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); } }
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; }
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; }