Exemplo n.º 1
0
        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();
            }
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        /// <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());
        }
Exemplo n.º 4
0
        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);
            }
        }