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); } } }
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)); } }
/// <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))); }
public PacketHandlerAttribute(EConnectionState state, Protocol.EPacket eType) { State = state; Type = eType; }
public static byte EncodePacketType(Protocol.EPacket eType) { return((byte)(Convert.ToByte(eType) & Packet.BitMaskType)); }
public Packet(Protocol.EPacket eType, MemoryStream stream) : this(eType, stream.ToArray()) { }
public Packet(Protocol.EPacket eType, byte[] payload) : this( eType, new ArraySegment <byte>(payload)) { }
private Packet(Protocol.EPacket eType, ArraySegment <byte> payload) { Type = eType; Payload = payload; }