private void SendPacketEnvelope(SocketState connection, PacketEnvelope envelope) { byte[] sendBuffer = Packetizer.AssembleMessagePacket(envelope, false, null, null); connection.Socket.Send(sendBuffer, sendBuffer.Length, SocketFlags.None); }
public static List <PacketEnvelope> DissasemblePacketData(SocketState state, bool encrypt, string encryptPacketKey, string keySalt) { List <PacketEnvelope> envelopes = new List <PacketEnvelope>(); try { if (state.PayloadBuilderLength + state.BytesReceived >= state.PayloadBuilder.Length) { Array.Resize(ref state.PayloadBuilder, state.PayloadBuilderLength + state.BytesReceived); } Buffer.BlockCopy(state.Buffer, 0, state.PayloadBuilder, state.PayloadBuilderLength, state.BytesReceived); state.PayloadBuilderLength = state.PayloadBuilderLength + state.BytesReceived; while (state.PayloadBuilderLength > Constants.PayloadHeaderSize) //[PayloadSize] and [CRC16] { Byte[] payloadDelimiterBytes = new Byte[4]; Byte[] payloadSizeBytes = new Byte[4]; Byte[] expectedCrc16Bytes = new Byte[2]; Buffer.BlockCopy(state.PayloadBuilder, 0, payloadDelimiterBytes, 0, payloadDelimiterBytes.Length); Buffer.BlockCopy(state.PayloadBuilder, 4, payloadSizeBytes, 0, payloadSizeBytes.Length); Buffer.BlockCopy(state.PayloadBuilder, 8, expectedCrc16Bytes, 0, expectedCrc16Bytes.Length); int payloadDelimiter = BitConverter.ToInt32(payloadDelimiterBytes, 0); int grossPayloadSize = BitConverter.ToInt32(payloadSizeBytes, 0); UInt16 expectedCrc16 = BitConverter.ToUInt16(expectedCrc16Bytes, 0); if (payloadDelimiter != Constants.PayloadDelimiter) { SkipPacket(ref state); //throw new Exception("Malformed payload packet, invalid delimiter."); continue; } if (grossPayloadSize < Constants.DefaultMinMsgSize || grossPayloadSize > Constants.DefaultMaxMsgSize) { SkipPacket(ref state); //throw new Exception("Malformed payload packet, invalid length."); continue; } if (state.PayloadBuilderLength < grossPayloadSize) { //We have data in the buffer, but it's not enough to make up // the entire message (fragmented packet) so we will break and wait on more data. break; } UInt16 actualCrc16 = Crc16.ComputeChecksum(state.PayloadBuilder, Constants.PayloadHeaderSize, grossPayloadSize - Constants.PayloadHeaderSize); if (actualCrc16 != expectedCrc16) { SkipPacket(ref state); //throw new Exception("Malformed payload packet, invalid CRC."); continue; } int netPayloadSize = grossPayloadSize - Constants.PayloadHeaderSize; byte[] payloadBytes = new byte[netPayloadSize]; Buffer.BlockCopy(state.PayloadBuilder, Constants.PayloadHeaderSize, payloadBytes, 0, netPayloadSize); if (encrypt) { payloadBytes = Decrypt(encryptPacketKey, keySalt, payloadBytes); } payloadBytes = Unzip(payloadBytes); envelopes.Add((PacketEnvelope)Serialization.ByteArrayToObject(payloadBytes)); //Zero out the consumed portion of the payload buffer - more for fun than anything else. Array.Clear(state.PayloadBuilder, 0, grossPayloadSize); Buffer.BlockCopy(state.PayloadBuilder, grossPayloadSize, state.PayloadBuilder, 0, state.PayloadBuilderLength - grossPayloadSize); state.PayloadBuilderLength -= grossPayloadSize; } } catch (Exception ex) { //TODO: allow this to be logged. } return(envelopes); }
private void SendPacketEnvelope(SocketState connection, PacketEnvelope envelope, string encryptionKey, string salt) { byte[] sendBuffer = Packetizer.AssembleMessagePacket(envelope, true, encryptionKey, salt); connection.Socket.Send(sendBuffer, sendBuffer.Length, SocketFlags.None); }