Esempio n. 1
0
        /// <summary>
        /// Read callback for the receiving socket
        /// </summary>
        /// <param name="ar">Ar.</param>
        private void OnRead(IAsyncResult ar)
        {
            EndPoint fromEndpoint = new IPEndPoint(IPAddress.Any, 0);
            int      length       = 0;

            try
            {
                length = socket.EndReceiveFrom(ar, ref fromEndpoint);
            }
            catch (ObjectDisposedException)
            {
                return;
            }

            byte[] data = new byte[length];
            System.Buffer.BlockCopy(buffer.data, 0, data, 0, length);
            BeginRead(); // start reading for more packets

            BitReader r     = new BitReader(data, length);
            bool      isUdp = r.ReadBool();

            if (!isUdp)
            {
                return;         // only accept udp packets
            }
            byte id     = r.ReadUInt8();
            var  packet = Udp.CreateUdpPacket(id);

            if (packet == null)
            {
                return;                 // failed to create a packet from the given id value
            }
            packet.ReadPacket(r);
            HandlePacket(packet, fromEndpoint);
        }
Esempio n. 2
0
        /// <summary>
        /// Packet data received
        /// </summary>
        /// <param name="length"></param>
        protected void ReceivedData(byte[] data, int length)
        {
            BitReader r     = new BitReader(data, length);
            bool      isUdp = r.ReadBool();
            byte      id;

            if (isUdp)
            {
                id = r.ReadUInt8();
                var udpPacket = Udp.CreateUdpPacket(id);
                if (udpPacket == null)
                {
                    return;
                }
                udpPacket.ReadPacket(r);
                HandleUdpPacket(udpPacket);
                return;
            }

            ulong receivedSalt = r.ReadUInt64();

            if (receivedSalt != salt)
            {
                return;                       // salt mismatch, TODO disconnect
            }
#if DEBUG
            if (Rand.Next(10000) / 100.0 < Simulate_Packet_Loss_Percent)
            {
                Log.Error("Stopped packet: " + r.ReadUInt16());
                return;
            }
#endif
            lastReceived = DateTime.Now;

            id = r.ReadUInt8();         // read packet type
            var channel = channels[id]; // get channel for packet type

            channel.ReceivePacket(r, id);
        }