コード例 #1
0
        public void Read(BinaryReaderBE Reader)
        {
            Flags.Read(Reader);
            Length = Reader.ReadUInt16BE();

            if (Flags.IsReliable())
            {
                MessageIndex.Read(Reader);
            }

            if (Flags.IsSequenced())
            {
                SequenceIndex.Read(Reader);
            }

            if (Flags.IsSequenced() || Flags.IsOrdered())
            {
                OrderIndex.Read(Reader);
                OrderChannel = Reader.ReadByte();
            }

            if (Flags.Split)
            {
                SplitCount = Reader.ReadUInt32BE();
                SplitId    = Reader.ReadUInt16BE();
                SplitIndex = Reader.ReadUInt32BE();
            }

            Payload = Reader.ReadBytes(Length);
        }
コード例 #2
0
        private Packet DecodePacketDecapsulated(Byte id, BinaryReaderBE reader)
        {
            Packet packet = null;

            switch ((PacketId)id)
            {
            case PacketId.ConnectedPing: packet = new ConnectedPing(); break;

            case PacketId.ConnectionRequest: packet = new ConnectionRequest(); break;

            case PacketId.ConnectionRequestAccepted: packet = new ConnectionRequestAccepted(); break;

            case PacketId.DisconnectionNotification: packet = new DisconnectionNotification(); break;

            default:
                packet = PacketConstructor(id);
                if (packet == null)
                {
                    throw new InvalidDataException("Unrecognized encapsulated packet ID");
                }
                break;
            }

            packet.Read(reader);
            return(packet);
        }
コード例 #3
0
        public void Read(BinaryReaderBE reader)
        {
            Byte flags = reader.ReadByte();

            Split       = (flags & 0x10) == 0x10;
            Reliability = (EncapsulatedReliability)(flags >> 5);
        }
コード例 #4
0
        private void HandlePacketDecapsulated(Byte id, BinaryReaderBE reader)
        {
            var packet = DecodePacketDecapsulated(id, reader);

            if (packet is ConnectedPing)
            {
                HandleConnectedPing(packet as ConnectedPing);
            }
            else if (packet is ConnectionRequestAccepted)
            {
                HandleConnectionRequestAccepted(packet as ConnectionRequestAccepted);
            }
            else if (packet is DisconnectionNotification)
            {
                HandleDisconnectionNotification(packet as DisconnectionNotification);
            }
            else if (id >= 0x80)
            {
                PacketReceived(this, packet);
            }
            else
            {
                throw new Exception("Unhandled encapsulated packet");
            }
        }
コード例 #5
0
        public void Read(BinaryReaderBE Reader)
        {
            Byte b1 = Reader.ReadByte();
            Byte b2 = Reader.ReadByte();
            Byte b3 = Reader.ReadByte();

            Number = (UInt32)b1 | ((UInt32)b2 << 8) | ((UInt32)b3 << 16);
        }
コード例 #6
0
 private void HandleEncapsulatedPayload(byte[] payload)
 {
     using (var encapMemory = new MemoryStream(payload))
         using (var encapStream = new BinaryReaderBE(encapMemory))
         {
             var encapId = encapStream.ReadByte();
             HandlePacketDecapsulated(encapId, encapStream);
         }
 }
コード例 #7
0
        public void HandlePacket(Byte id, BinaryReaderBE reader)
        {
            var packet = DecodePacket(id, reader);

            if (packet is Acknowledgement)
            {
                // TODO - ACK mechanism not handled
            }
            else if (packet is DataPacket)
            {
                var encap = (packet as DataPacket).WrappedPacket as EncapsulatedPacket;
                HandleEncapsulatedPacket(packet as DataPacket, encap);
            }
            else
            {
                throw new Exception("Unhandled packet");
            }
        }
コード例 #8
0
        private Packet DecodePacket(Byte id, BinaryReaderBE reader)
        {
            Packet packet = null;

            switch ((PacketId)id)
            {
            case PacketId.OpenConnectionRequest1: packet = new OpenConnectionRequest1(); break;

            case PacketId.OpenConnectionResponse1: packet = new OpenConnectionResponse1(); break;

            case PacketId.OpenConnectionRequest2: packet = new OpenConnectionRequest2(); break;

            case PacketId.OpenConnectionResponse2: packet = new OpenConnectionResponse2(); break;

            default: throw new InvalidDataException("Unrecognized packet ID");
            }

            packet.Read(reader);
            return(packet);
        }
コード例 #9
0
        private Packet DecodePacket(Byte id, BinaryReaderBE reader)
        {
            Packet packet = null;

            if (id >= 0x80 && id < 0xA0)
            {
                var dataPkt = new DataPacket();
                dataPkt.WrappedPacket = new EncapsulatedPacket();
                packet = dataPkt;
            }
            else
            {
                switch ((PacketId)id)
                {
                case PacketId.ACK: packet = new Acknowledgement(); break;

                default: throw new InvalidDataException("Unrecognized packet ID");
                }
            }

            packet.Read(reader);
            return(packet);
        }
コード例 #10
0
 private void OnPacketReceived(IPEndPoint address, byte[] packet)
 {
     using (var stream = new MemoryStream(packet))
         using (var reader = new BinaryReaderBE(stream))
         {
             byte id = reader.ReadByte();
             if (id < 0x80)
             {
                 var decoded = DecodePacket(id, reader);
                 HandlePacket(address, decoded);
             }
             else
             {
                 if (Session != null)
                 {
                     Session.HandlePacket(id, reader);
                 }
                 else
                 {
                     throw new Exception("Unhandled session packet - no session established!");
                 }
             }
         }
 }