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