private void ReceiveData(IAsyncResult result) { var resultWrapper = (Client)result.AsyncState; try { var size = resultWrapper.EndRead(result); m_CurrentlyReceived += size; if (m_CurrentlyReceived >= HEADER_SIZE) { AriesHeader Header = ReadAriesHeader((byte[])resultWrapper.Buffer.Clone()); PacketType = Header.PacketType; PacketSize = Header.PacketSize; if (m_CurrentlyReceived >= PacketSize) { ProcessBuffer(resultWrapper); resultWrapper.BeginRead(ReceiveData); } } else { resultWrapper.BeginRead(ReceiveData); } } catch (Exception e) { Console.WriteLine(e); Disconnected.InvokeSafely(this, resultWrapper); resultWrapper.CloseAndDisposeSslStream(); } }
private AriesHeader ReadAriesHeader(byte[] Buffer) { AriesHeader Header = new AriesHeader(); BinaryReader Reader = new BinaryReader(new MemoryStream(Buffer)); Header.PacketType = Reader.ReadUInt32(); Header.Timestamp = Reader.ReadUInt32(); Header.PacketSize = Reader.ReadUInt32() + HEADER_SIZE; Reader.Close(); return(Header); }
/// <summary> /// Reconstructs a (full) Voltron packet in memory. /// </summary> /// <param name="AriesHeader">The header of an aries packet.</param> /// <param name="VoltronPacket">The body (and header) of a Voltron packet.</param> /// <returns>A Voltron packet with its corresponding Aries header.</returns> private byte[] ReconstructVoltronPacket(AriesHeader AHeader, byte[] VoltronPacket) { MemoryStream OutputStream = new MemoryStream(); EndianBinaryWriter Writer = new EndianBinaryWriter(new LittleEndianBitConverter(), OutputStream); Writer.Write(AHeader.PacketType); Writer.Write(AHeader.Timestamp); Writer.Write(AHeader.PacketSize); Writer.Flush(); Writer = new EndianBinaryWriter(new BigEndianBitConverter(), OutputStream); Writer.Write(VoltronPacket); Writer.Flush(); return(OutputStream.ToArray()); }
private void CompileVoltronPackets(Client C) { MemoryStream OutputStream = new MemoryStream(); EndianBinaryReader Reader; EndianBinaryWriter Writer; AriesHeader AHeader = new AriesHeader(); AHeader.PacketSize = m_PacketSize; AHeader.PacketType = m_PacketType; //Reassemble all the Voltron packets. for (int i = 0; i < C.ReceivedSplitBuffers.Count; i++) { SplitBufferPDU SplitBuffer; C.ReceivedSplitBuffers.TryDequeue(out SplitBuffer); Reader = new EndianBinaryReader(new BigEndianBitConverter(), OutputStream); Writer = new EndianBinaryWriter(new BigEndianBitConverter(), OutputStream); Writer.Write(Reader.ReadBytes((int)SplitBuffer.FragmentSize)); Writer.Flush(); } MemoryStream VoltronPackets = new MemoryStream(OutputStream.ToArray()); uint BufSize = (uint)VoltronPackets.Length; for (int i = 0; i < BufSize; i++) { Reader = new EndianBinaryReader(new BigEndianBitConverter(), VoltronPackets); VoltronHeader Header = ReadVoltronHeader(Reader.ReadBytes(12)); Reader.BaseStream.Position = 0; //Backtrack to beginning of stream. VoltronPacket VPacket = new VoltronPacket( ReconstructVoltronPacket(AHeader, Reader.ReadBytes((int)Header.PacketSize)), true); C.ReceivedPackets.Enqueue(VPacket); BufSize -= Header.PacketSize; ReceivedData?.Invoke(this, C); } }