public static ToffeeInternalPacketReadResult Read(ToffeeParticipant receiver, byte[] packet) { try { // Iterate through the packet ToffeePacketIterator iterator = new ToffeePacketIterator(receiver, packet); // Get the header, data, and CRC InternalPacketHeader header = iterator.ReadStruct <InternalPacketHeader>(); byte[] packetData = iterator.ReadBytes(header.Length); uint sentCrc = iterator.ReadUInt32(); // Is the CRC correct? uint calculatedCrc = CRC.CalculateCRC32(packetData); if (sentCrc != calculatedCrc) { return(new ToffeeInternalPacketReadResult(false, new InternalPacketHeader(), null)); } // Is this packet compressed? if (header.Compressed) { packetData = CompressionService.Decompress(packetData); } // Return the read result return(new ToffeeInternalPacketReadResult(true, header, packetData)); } catch { return(new ToffeeInternalPacketReadResult(false, new InternalPacketHeader(), null)); } }
protected virtual void HandleClientHelloResponse(byte[] packet) { // Get the response ToffeePacketIterator iterator = new ToffeePacketIterator(this, packet); ClientHelloResponse response = iterator.ReadStruct <ClientHelloResponse>(); // Was the request successful? if (response.Success) { // Does this server require a heartbeat? if (response.HeartbeatTime != 0) { HeartbeatTimer = new Timer(response.HeartbeatTime * 1000); HeartbeatTimer.Elapsed += SendHeartbeat; HeartbeatTimer.Start(); } // Do we have encryption keys? ForceEncryption = response.ForcedEncryption; if ((!UseEncryption) && (response.ForcedEncryption)) { // The server requires encryption that we don't have enabled. Disconnect(); return; } } else { // OnConnectionFailed(this); Disconnect(); } }
/// <summary> /// Handles recieved packets. /// </summary> /// <param name="session">The session that received the packet.</param> /// <param name="packet">The packet data that was received.</param> public override void HandlePacket(ToffeeSession session, byte[] packet) { // Get the session ClientAgentSession sender = (ClientAgentSession)session; // Read the packet ToffeeClientPacketReadResult result = ToffeeClientPacket.Read(session, packet); // Was this a succcessful read? if (result.Success) { Log?.Debug("Received 0x{0:X2} from session {1}.", result.Header.OpCode, sender.SessionId); ToffeePacketIterator iterator = new ToffeePacketIterator(session, result.Data); switch (result.Header.OpCode) { case (ushort)ToffeeOpCode.ClientHello: HandleClientHello(sender, iterator.ReadStruct <ClientHello>()); break; case (ushort)ToffeeOpCode.ClientHeartbeat: HandleClientHeartbeat(sender); break; } } else { Log?.Warning("Received corrupt packet from session {1}.", sender.SessionId); } }
public static ToffeeClientPacketReadResult Read(ToffeeParticipant receiver, byte[] packet) { try { // Is this packet encrypted? bool encrypted = packet[0] == 0x01; if (encrypted) { // Is this client setup to use encryption? if (receiver.UseEncryption) { packet = receiver.Encryption.Decrypt(packet.Skip(1).ToArray()); } } else { packet = packet.Skip(1).ToArray(); } // Iterate through the packet ToffeePacketIterator iterator = new ToffeePacketIterator(receiver, packet); // Get the header, data, and CRC ClientPacketHeader header = iterator.ReadStruct <ClientPacketHeader>(); byte[] packetData = iterator.ReadBytes(header.Length); uint sentCrc = iterator.ReadUInt32(); // Is the CRC correct? uint calculatedCrc = CRC.CalculateCRC32(packetData); if (sentCrc != calculatedCrc) { return(new ToffeeClientPacketReadResult(false, encrypted, new ClientPacketHeader(), null)); } // Is this packet compressed? if (header.Compressed) { packetData = CompressionService.Decompress(packetData); } // Return the read result return(new ToffeeClientPacketReadResult(true, encrypted, header, packetData)); } catch { return(new ToffeeClientPacketReadResult(false, false, new ClientPacketHeader(), null)); } }