public UserMessagesQueue AddMessageToQueue(UserMessage message) { ulong desiredStartPacketIndex = message.PacketIndex - message.UserPacketIndex; UserMessagesQueue queue; lock (this) { if (Queues == null) Queues = new UserMessagesQueuesSet(); queue = Queues.GetQueue(desiredStartPacketIndex, message.UserPacketsCount); queue.Messages[message.UserPacketIndex] = message; } return queue; }
private void ProcessMessage(UserMessage message) { Neighbor neighbor; var messages = ApplyMessageBuffer(message, out neighbor); if (messages != null) foreach (var msg in messages) { var userMessage = (UserMessage)msg; if (userMessage.UserPacketsCount > 1) { var queue = neighbor.AddMessageToQueue(message); if (queue.QueueReady) { var queueMessages = neighbor.ExtractMessagesFromQueue(queue); var buffer = new byte[queueMessages.Sum(u => u.UserData.Length)]; int offset = 0; foreach (var queueMessage in queueMessages) { queueMessage.UserData.CopyTo(buffer, offset); offset += queueMessage.UserData.Length; } OnUserMessageReceived(buffer); } } else OnUserMessageReceived(((UserMessage)msg).UserData); } }