Beispiel #1
0
        private void PacketHandler()
        {
            IncomingPacket incomingPacket = new IncomingPacket();
            Packet packet = null;
            Simulator simulator = null;

            while (connected)
            {
                // Reset packet to null for the check below
                packet = null;

                if (PacketInbox.Dequeue(500, ref incomingPacket))
                {
                    packet = incomingPacket.Packet;
                    simulator = incomingPacket.Simulator;

                    if (packet != null)
                    {
                        // Skip the ACK handling on packets synthesized from CAPS messages
                        if (packet.Header.Sequence != 0)
                        {
                            #region ACK accounting
                            // TODO: Replace PacketArchive Queue<> with something more efficient

                            // Check the archives to see whether we already received this packet
                            lock (simulator.PacketArchive)
                            {
                                if (simulator.PacketArchive.Contains(packet.Header.Sequence))
                                {
                                    if (packet.Header.Resent)
                                    {
                                        Client.DebugLog("Received resent packet #" + packet.Header.Sequence);
                                    }
                                    else
                                    {
                                        Client.Log(String.Format("Received a duplicate of packet #{0}, current type: {1}",
                                            packet.Header.Sequence, packet.Type), Helpers.LogLevel.Warning);
                                    }

                                    // Avoid firing a callback twice for the same packet
                                    continue;
                                }
                                else
                                {
                                    // Keep the PacketArchive size within a certain capacity
                                    while (simulator.PacketArchive.Count >= Settings.PACKET_ARCHIVE_SIZE)
                                    {
                                        simulator.PacketArchive.Dequeue(); simulator.PacketArchive.Dequeue();
                                        simulator.PacketArchive.Dequeue(); simulator.PacketArchive.Dequeue();
                                    }

                                    simulator.PacketArchive.Enqueue(packet.Header.Sequence);
                                }
                            }

                            #endregion ACK accounting

                            #region ACK handling

                            // Handle appended ACKs
                            if (packet.Header.AppendedAcks)
                            {
                                lock (simulator.NeedAck)
                                {
                                    for (int i = 0; i < packet.Header.AckList.Length; i++)
                                        simulator.NeedAck.Remove(packet.Header.AckList[i]);
                                }
                            }

                            // Handle PacketAck packets
                            if (packet.Type == PacketType.PacketAck)
                            {
                                PacketAckPacket ackPacket = (PacketAckPacket)packet;

                                lock (simulator.NeedAck)
                                {
                                    for (int i = 0; i < ackPacket.Packets.Length; i++)
                                        simulator.NeedAck.Remove(ackPacket.Packets[i].ID);
                                }
                            }

                            #endregion ACK handling
                        }

                        #region FireCallbacks

                        if (Client.Settings.SYNC_PACKETCALLBACKS)
                        {
                            PacketEvents.RaiseEvent(PacketType.Default, packet, simulator);
                            PacketEvents.RaiseEvent(packet.Type, packet, simulator);
                        }
                        else
                        {
                            PacketEvents.BeginRaiseEvent(PacketType.Default, packet, simulator);
                            PacketEvents.BeginRaiseEvent(packet.Type, packet, simulator);
                        }

                        #endregion FireCallbacks
                    }
                }
            }
        }
Beispiel #2
0
        private void PacketHandler()
        {
            IncomingPacket incomingPacket = new IncomingPacket();
            Packet packet = null;
            Simulator simulator = null;
            WaitCallback callback = new WaitCallback(CallPacketDelegate);

            while (connected)
            {
                // Reset packet to null for the check below
                packet = null;

                if (PacketInbox.Dequeue(500, ref incomingPacket))
                {
                    packet = incomingPacket.Packet;
                    simulator = incomingPacket.Simulator;

                    if (packet != null)
                    {
                        #region Archive Duplicate Search

                        // TODO: Replace PacketArchive Queue<> with something more efficient

                        // Check the archives to see whether we already received this packet
                        lock (simulator.PacketArchive)
                        {
                            if (simulator.PacketArchive.Contains(packet.Header.Sequence))
                            {
                                if (packet.Header.Resent)
                                {
                                    Client.DebugLog("Received resent packet #" + packet.Header.Sequence);
                                }
                                else
                                {
                                    Client.Log("Received a duplicate " + packet.Type.ToString() + " packet!",
                                        Helpers.LogLevel.Error);
                                }

                                // Avoid firing a callback twice for the same packet
                                goto End;
                            }
                            else
                            {
                                // Keep the Inbox size within a certain capacity
                                while (simulator.PacketArchive.Count >= Settings.PACKET_ARCHIVE_SIZE)
                                {
                                    simulator.PacketArchive.Dequeue(); simulator.PacketArchive.Dequeue();
                                    simulator.PacketArchive.Dequeue(); simulator.PacketArchive.Dequeue();
                                }

                                simulator.PacketArchive.Enqueue(packet.Header.Sequence);
                            }
                        }

                        #endregion Archive Duplicate Search

                        #region ACK handling

                        // Handle appended ACKs
                        if (packet.Header.AppendedAcks)
                        {
                            lock (simulator.NeedAck)
                            {
                                for (int i = 0; i < packet.Header.AckList.Length; i++)
                                    simulator.NeedAck.Remove(packet.Header.AckList[i]);
                            }
                        }

                        // Handle PacketAck packets
                        if (packet.Type == PacketType.PacketAck)
                        {
                            PacketAckPacket ackPacket = (PacketAckPacket)packet;

                            lock (simulator.NeedAck)
                            {
                                for (int i = 0; i < ackPacket.Packets.Length; i++)
                                    simulator.NeedAck.Remove(ackPacket.Packets[i].ID);
                            }
                        }

                        #endregion ACK handling

                        #region FireCallbacks

                        if (Callbacks.ContainsKey(packet.Type))
                        {
                            List<NetworkManager.PacketCallback> callbackArray = Callbacks[packet.Type];

                            // Fire any registered callbacks
                            for (int i = 0; i < callbackArray.Count; i++)
                            {
                                if (callbackArray[i] != null)
                                {
                                    bool sync = Client.Settings.SYNC_PACKETCALLBACKS;
                                    if (sync)
                                    {
                                        callbackArray[i](packet, simulator);
                                    }
                                    else
                                    {
                                        PacketCallbackWrapper wrapper;
                                        wrapper.Callback = callbackArray[i];
                                        wrapper.Packet = packet;
                                        wrapper.Simulator = simulator;
                                        Toub.Threading.ManagedThreadPool.QueueUserWorkItem(callback, wrapper);
                                    }
                                }
                            }
                        }

                        if (Callbacks.ContainsKey(PacketType.Default))
                        {
                            List<NetworkManager.PacketCallback> callbackArray = Callbacks[PacketType.Default];

                            // Fire any registered callbacks
                            for (int i = 0; i < callbackArray.Count; i++)
                            {
                                if (callbackArray[i] != null)
                                {
                                    bool sync = Client.Settings.SYNC_PACKETCALLBACKS;
                                    if (sync)
                                    {
                                        callbackArray[i](packet, simulator);
                                    }
                                    else
                                    {
                                        PacketCallbackWrapper wrapper;
                                        wrapper.Callback = callbackArray[i];
                                        wrapper.Packet = packet;
                                        wrapper.Simulator = simulator;
                                        Toub.Threading.ManagedThreadPool.QueueUserWorkItem(callback, wrapper);
                                    }
                                }
                            }
                        }

                        #endregion FireCallbacks

                    End: ;
                    }
                }
            }
        }
        private void IncomingPacketHandler()
        {
            IncomingPacket incomingPacket = new IncomingPacket();
            Packet packet = null;
            Simulator simulator = null;

            while (connected)
            {
                // Reset packet to null for the check below
                packet = null;

                if (PacketInbox.Dequeue(100, ref incomingPacket))
                {
                    packet = incomingPacket.Packet;
                    simulator = incomingPacket.Simulator;

                    if (packet != null)
                    {
                        // Skip blacklisted packets
                        if (UDPBlacklist.Contains(packet.Type.ToString()))
                        {
                            Logger.Log(String.Format("Discarding Blacklisted packet {0} from {1}",
                                packet.Type, simulator.IPEndPoint), Helpers.LogLevel.Warning);
                            return;
                        }

                        // Fire the callback(s), if any
                        PacketEvents.RaiseEvent(packet.Type, packet, simulator);
                    }
                }
            }
        }
Beispiel #4
0
        private void IncomingPacketHandler()
        {
            IncomingPacket incomingPacket = new IncomingPacket();
            Packet packet = null;
            Simulator simulator = null;

            while (connected)
            {
                // Reset packet to null for the check below
                packet = null;

                if (PacketInbox.Dequeue(100, ref incomingPacket))
                {
                    packet = incomingPacket.Packet;
                    simulator = incomingPacket.Simulator;

                    if (packet != null)
                    {
                        // skip blacklisted packets
                        if (UDPBlacklist.Contains(packet.Type.ToString()))
                        {
                            Logger.Log(String.Format("Discarding Blacklisted packet {0} from {1}",
                                packet.Type, simulator.IPEndPoint), Helpers.LogLevel.Warning);
                            return;
                        }

                        #region Fire callbacks

                        if (Client.Settings.SYNC_PACKETCALLBACKS)
                            PacketEvents.RaiseEvent(packet.Type, packet, simulator);
                        else
                            PacketEvents.BeginRaiseEvent(packet.Type, packet, simulator);

                        #endregion Fire callbacks
                    }
                }
            }
        }
 public void handleIncomingPacket(Player player, IncomingPacket packet)
 {
 }
 public void handleIncomingPacket(Player player, IncomingPacket packet)
 {
     // this can be left blank
 }
Beispiel #7
0
 public void handleIncomingPacket(Player player, IncomingPacket packet)
 {
     player.SendPacket(new InitCryptoComposer());
 }
Beispiel #8
0
        public IncomingPacket Parse(SocketManager manager, string from)
        {
            int idx            = 0;
            var transportEvent = (TransportEventTypes)ToInt(from[idx++]);
            var socketIOEvent  = SocketIOEventTypes.Unknown;
            var nsp            = string.Empty;
            var id             = -1;
            var payload        = string.Empty;
            int attachments    = 0;

            if (from.Length > idx && ToInt(from[idx]) >= 0)
            {
                socketIOEvent = (SocketIOEventTypes)ToInt(from[idx++]);
            }
            else
            {
                socketIOEvent = SocketIOEventTypes.Unknown;
            }

            // Parse Attachment
            if (socketIOEvent == SocketIOEventTypes.BinaryEvent || socketIOEvent == SocketIOEventTypes.BinaryAck)
            {
                int endIdx = from.IndexOf('-', idx);
                if (endIdx == -1)
                {
                    endIdx = from.Length;
                }

                int.TryParse(from.Substring(idx, endIdx - idx), out attachments);

                idx = endIdx + 1;
            }

            // Parse Namespace
            if (from.Length > idx && from[idx] == '/')
            {
                int endIdx = from.IndexOf(',', idx);
                if (endIdx == -1)
                {
                    endIdx = from.Length;
                }

                nsp = from.Substring(idx, endIdx - idx);
                idx = endIdx + 1;
            }
            else
            {
                nsp = "/";
            }

            // Parse Id
            if (from.Length > idx && ToInt(from[idx]) >= 0)
            {
                int startIdx = idx++;
                while (from.Length > idx && ToInt(from[idx]) >= 0)
                {
                    idx++;
                }

                int.TryParse(from.Substring(startIdx, idx - startIdx), out id);
            }

            // What left is the payload data
            if (from.Length > idx)
            {
                payload = from.Substring(idx);
            }
            else
            {
                payload = string.Empty;
            }

            var packet = new IncomingPacket(transportEvent, socketIOEvent, nsp, id);

            packet.AttachementCount = attachments;

            string eventName = packet.EventName;

            object[] args = null;

            switch (socketIOEvent)
            {
            case SocketIOEventTypes.Unknown:
                packet.DecodedArg = payload;
                break;

            case SocketIOEventTypes.Connect:
                // No Data | Object
                if (!string.IsNullOrEmpty(payload))
                {
                    (eventName, args) = ReadData(manager, packet, payload);
                }
                break;

            case SocketIOEventTypes.Disconnect:
                // No Data
                break;

            case SocketIOEventTypes.Error:
                // String | Object
                (eventName, args) = ReadData(manager, packet, payload);
                break;

            default:
                // Array
                (eventName, args) = ReadData(manager, packet, payload);
                // Save payload until all attachments arrive
                if (packet.AttachementCount > 0)
                {
                    packet.DecodedArg = payload;
                }
                break;
            }

            packet.EventName = eventName;

            if (args != null)
            {
                if (args.Length == 1)
                {
                    packet.DecodedArg = args[0];
                }
                else
                {
                    packet.DecodedArgs = args;
                }
            }

            if (packet.AttachementCount > 0)
            {
                PacketWithAttachment = packet;
                return(IncomingPacket.Empty);
            }

            return(packet);
        }
Beispiel #9
0
        private (string, object[]) ReadData(SocketManager manager, IncomingPacket packet, string payload)
        {
            Socket socket = manager.GetSocket(packet.Namespace);

            string       eventName    = packet.EventName;
            Subscription subscription = socket.GetSubscription(eventName);

            object[] args = null;

            switch (packet.SocketIOEvent)
            {
            case SocketIOEventTypes.Unknown:
                // TODO: Error?
                break;

            case SocketIOEventTypes.Connect:
                // No Data | Object
                args = ReadParameters(socket, subscription, new System.IO.StringReader(payload));
                break;

            case SocketIOEventTypes.Disconnect:
                // No Data
                break;

            case SocketIOEventTypes.Error:
                // String | Object
                switch (payload[0])
                {
                case '{':
                    args = ReadParameters(socket, subscription, new System.IO.StringReader(payload));
                    break;

                default:
                    args = new object[] { new Error(payload) };
                    break;
                }
                break;

            case SocketIOEventTypes.Ack:
                eventName    = IncomingPacket.GenerateAcknowledgementNameFromId(packet.Id);
                subscription = socket.GetSubscription(eventName);

                args = ReadParameters(socket, subscription, JSON.LitJson.JsonMapper.ToObject <List <object> >(payload), 0);

                break;

            default:
                // Array

                var reader = new System.IO.StringReader(payload);
                var array  = JSON.LitJson.JsonMapper.ToObject <List <object> >(new JSON.LitJson.JsonReader(reader));
                if (array.Count > 0)
                {
                    eventName    = array[0].ToString();
                    subscription = socket.GetSubscription(eventName);
                }

                if (packet.AttachementCount == 0 || packet.Attachements != null)
                {
                    args = ReadParameters(socket, subscription, array, 1);
                }

                break;
            }

            return(eventName, args);
        }
Beispiel #10
0
        public void HandlePacket(T client, IncomingPacket packet)
        {
            int id = packet.ReadInt32();

            this._handlers[id].Invoke(client, packet);
        }