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 } } } }
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); } } } }
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 }
public void handleIncomingPacket(Player player, IncomingPacket packet) { player.SendPacket(new InitCryptoComposer()); }
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); }
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); }
public void HandlePacket(T client, IncomingPacket packet) { int id = packet.ReadInt32(); this._handlers[id].Invoke(client, packet); }