bool Connections::IsValidPacket(void* PacketHeader, WORD PacketLength) { if (GetHeaderSize() > PacketLength) { return false; } Packet packet; packet.AttachData((BYTE*)PacketHeader, PacketLength); return packet.IsValidPacket(); }
int Connections::CompleteRecv(DWORD TransferedBytes) { FUNCTION_BEGIN(); if (0 == TransferedBytes) { return 1; } IncreaseBytesRecv(TransferedBytes); if (false == _recvBuffer.IncreasePushPos(TransferedBytes)) { Logger::Log("Session[%X] Recv Buffer OverFlow : BufferCur[%d] BufferMax[%d] TransferedBytes[%u]\n", this, _recvBuffer.GetCurSize(), _recvBuffer.GetQueueSize(), TransferedBytes); return 2; } int rc = 0; WORD PacketLength = 0; Packet packet; do { rc = MakeSureCompletedPacket(&_recvBuffer, &PacketLength, _PacketEncoder); if (0 != rc) { if (2 == rc || 4 == rc) { break; } Logger::Log("Session[%X] MakeSureCompletedPacket Error[%d]\n", this, rc); return rc; } if (true != IsValidPacket(_recvBuffer.GetQueueWorkPtr(), PacketLength)) { Logger::Log("true != IsValidPacket()\n"); } packet.AttachData(_recvBuffer.GetQueueWorkPtr(), PacketLength); _recvBuffer.IncreaseWorkPos(packet.GetUsedSize()); if (_PacketEncoder) { rc = _PacketEncoder->RxDecrypt(packet); if (0 != rc) { Logger::Log("Session[%X] RxDecrypt Error[%d]\n", this, rc); return rc; } } BYTE ValidSequence = (BYTE)(_PacketRecvCount & PACKET_MAX_SEQUENCE); if (false == HasValidSequence(packet.GetPacketHeader(), ValidSequence)) { Logger::Log("Session[%X] Sequence Error[%d] PacketSEQ[%u] CurrentSEQ[%u]\n", this, rc, GetSequence(_recvBuffer.GetQueueWorkPtr()), ValidSequence); return 3; //ERR_NET_PACKET_SEQUENCE_FAIL } IncreasePacketRecv(); _NetworkRef->PostNetEventMessage((WPARAM)NETEVENT_RECV, (LPARAM)this); } while (0 == rc); rc = PostRecv(); if (0 != rc) { return rc; } return 0; }