Esempio n. 1
0
        public void Receive(ArraySegment <byte> buffer)
        {
            if (State == EConnectionState.Disconnected)
            {
                return;
            }

            Protocol.EPacket eType = PacketReader.DecodePacketType(buffer.Array[buffer.Offset]);
            if (eType == Protocol.EPacket.Persistence)
            {
                GameStatePersistence.Receive(buffer);
            }
            else
            {
                if (m_PackageReader == null)
                {
                    m_PackageReader = new PacketReader();
                }

                Packet packet = m_PackageReader.Read(new ByteReader(buffer));
                if (packet != null)
                {
                    m_PackageReader = null;
                    Dispatcher.Dispatch(State, packet);
                }
            }
        }
Esempio n. 2
0
        public static ArraySegment <byte> MakeRaw(Protocol.EPacket eType, byte[] payload)
        {
            Packet       packet = new Packet(eType, payload);
            MemoryStream stream = new MemoryStream();
            BinaryWriter writer = new BinaryWriter(stream);

            new PacketWriter(packet).Write(writer);
            return(stream.ToArray());
        }
        private static void AssertIsPersistencePayload(ArraySegment <byte> buffer)
        {
            if (buffer.Array == null)
            {
                throw new ArgumentNullException(nameof(buffer));
            }

            Protocol.EPacket eType = PacketReader.DecodePacketType(buffer.Array[buffer.Offset]);
            if (eType != Protocol.EPacket.Persistence)
            {
                throw new ArgumentException(nameof(buffer));
            }
        }
Esempio n. 4
0
        /// <summary>
        ///     Reads a <see cref="Packet" /> from the given reader. Returns null if the packet is fragmented and
        ///     parts are still missing.
        /// </summary>
        /// <param name="reader"></param>
        /// <returns>Serialized packet or null if the packet is fragmented and not yet complete.</returns>
        public Packet Read(ByteReader reader)
        {
            // 1 Byte header
            byte header = reader.Binary.ReadByte();

            Protocol.EPacket eType = DecodePacketType(header);

            // 4 Bytes size of payload
            int iPayloadSize = reader.Binary.ReadInt32();

            // handle fragmented packages
            if ((header & Packet.BitMaskFragment_More) != Packet.BitMaskFragment_None)
            {
                if (m_FragmentedBuffer == null)
                {
                    m_FragmentedStream = new MemoryStream();
                    m_FragmentedBuffer = new BinaryWriter(m_FragmentedStream);
                }

                m_FragmentedBuffer.Write(reader.Binary.ReadBytes(iPayloadSize));
                return(null);
            }

            if ((header & Packet.BitMaskFragment_End) != Packet.BitMaskFragment_None)
            {
                if (m_FragmentedBuffer == null)
                {
                    throw new PacketSerializingException(
                              $"Package ({eType}) was flagged as END of a fragmented packet: got no START.");
                }

                m_FragmentedBuffer.Write(reader.Binary.ReadBytes(iPayloadSize));
                Done = true;
                return(new Packet(eType, m_FragmentedStream));
            }

            Done = true;
            return(new Packet(eType, reader.Binary.ReadBytes(iPayloadSize)));
        }
Esempio n. 5
0
 public PacketHandlerAttribute(EConnectionState state, Protocol.EPacket eType)
 {
     State = state;
     Type  = eType;
 }
Esempio n. 6
0
 public static byte EncodePacketType(Protocol.EPacket eType)
 {
     return((byte)(Convert.ToByte(eType) & Packet.BitMaskType));
 }
Esempio n. 7
0
 public Packet(Protocol.EPacket eType, MemoryStream stream) : this(eType, stream.ToArray())
 {
 }
Esempio n. 8
0
 public Packet(Protocol.EPacket eType, byte[] payload) : this(
         eType,
         new ArraySegment <byte>(payload))
 {
 }
Esempio n. 9
0
 private Packet(Protocol.EPacket eType, ArraySegment <byte> payload)
 {
     Type    = eType;
     Payload = payload;
 }