/// <summary>
        ///     Finalizes a completed fragmented message and invokes message received events.
        /// </summary>
        /// <param name="message">The message received.</param>
        void FinalizeFragmentedMessage(FragmentedMessage message)
        {
            IEnumerable <FragmentedMessage.Fragment> orderedFragments = message.received.OrderBy((x) => x.fragmentID);

            byte[] completeData = new byte[(orderedFragments.Count() - 1) * FragmentSize + orderedFragments.Last().data.Length];
            int    ptr          = 0;

            foreach (FragmentedMessage.Fragment fragment in orderedFragments)
            {
                Buffer.BlockCopy(fragment.data, fragment.offset, completeData, ptr, fragment.data.Length - fragment.offset);
                ptr += fragment.data.Length - fragment.offset;
            }

            InvokeDataReceived(completeData, SendOption.FragmentedReliable);
        }
        /// <summary>
        ///     Gets a message from those we've begun receiving or adds a new one.
        /// </summary>
        /// <param name="messageId">The Id of the message to find.</param>
        /// <returns></returns>
        FragmentedMessage GetFragmentedMessage(ushort messageId)
        {
            lock (fragmentedMessagesReceived)
            {
                FragmentedMessage message;
                if (fragmentedMessagesReceived.ContainsKey(messageId))
                {
                    message = fragmentedMessagesReceived[messageId];
                }
                else
                {
                    message = new FragmentedMessage();

                    fragmentedMessagesReceived.Add(messageId, message);
                }

                return(message);
            }
        }