示例#1
0
        public void HandleLatestMessageID(NetIncomingMessage inc)
        {
            ushort messageId = inc.ReadUInt16();

            recipient = inc.SenderConnection;

            //id matches, all good
            if (messageId == lastMessageID)
            {
                //Debug.WriteLine("Received ack message: " + messageId + ", all good");
                return;
            }

            if (ReliableChannel.IdDiff(lastMessageID, messageId) > NetConfig.ReliableMessageBufferSize)
            {
                Debug.WriteLine("id diff > NetConfig.ReliableMessageBufferSize, resetting reliable channel");
                lastMessageID = messageId;
                return;
            }

            if (messageId < lastMessageID && Math.Abs((int)lastMessageID - (int)messageId) < ushort.MaxValue / 2)
            {
                Debug.WriteLine("Received id update message: " + messageId + ": ignoring, already received (" + lastMessageID + ")");
                return;
            }

            Debug.WriteLine("Received id update message: " + messageId + ", need to rerequest messages (last id: " + lastMessageID + ")");

            if (lastMessageID > ushort.MaxValue / 2 && messageId < short.MaxValue / 2)
            {
                for (ushort i = (ushort)Math.Min((int)lastMessageID + 1, ushort.MaxValue); i <= ushort.MaxValue; i++)
                {
                    if (i == ushort.MaxValue && lastMessageID == ushort.MaxValue)
                    {
                        break;
                    }
                    QueueMissingMessage(i);
                    if (i == ushort.MaxValue)
                    {
                        break;
                    }
                }

                for (ushort i = 1; i <= messageId; i++)
                {
                    QueueMissingMessage(i);
                }
            }
            else
            {
                //we already wrapped around but message hasn't, so it's an old message
                if (lastMessageID < ushort.MaxValue / 2 && messageId > ushort.MaxValue / 2)
                {
                    Debug.WriteLine("old already received message, ignore");
                    return;
                }

                for (ushort i = (ushort)Math.Min((int)lastMessageID + 1, ushort.MaxValue); i <= messageId; i++)
                {
                    QueueMissingMessage(i);
                    if (i == ushort.MaxValue)
                    {
                        break;
                    }
                }
            }

            lastMessageID = messageId;
        }
示例#2
0
        public bool CheckMessage(NetIncomingMessage message)
        {
            recipient = message.SenderConnection;

            ushort id = message.ReadUInt16();

            if (ReliableChannel.IdDiff(lastMessageID, id) > NetConfig.ReliableMessageBufferSize)
            {
                Debug.WriteLine("id diff > NetConfig.ReliableMessageBufferSize, resetting reliable channel");
                lastMessageID = id;
                return(false);
            }

            Debug.WriteLine("received message ID " + id + " - last id: " + lastMessageID);

            //wrapped around
            if (Math.Abs((int)lastMessageID - (int)id) > ushort.MaxValue / 2)
            {
                //id wrapped around and we missed some messages in between, rerequest them
                if (lastMessageID > ushort.MaxValue / 2 && id >= 1)
                {
                    for (ushort i = (ushort)(Math.Min(lastMessageID, (ushort)(ushort.MaxValue - 1)) + 1); i < ushort.MaxValue; i++)
                    {
                        QueueMissingMessage(i);
                    }
                    for (ushort i = 1; i < id; i++)
                    {
                        QueueMissingMessage(i);
                    }

                    lastMessageID = id;
                }
                //we already wrapped around but the message hasn't, check if it's a duplicate
                else if (lastMessageID < ushort.MaxValue / 2 && id > ushort.MaxValue / 2 && !missingMessages.ContainsKey(id))
                {
                    Debug.WriteLine("old already received message, ignore");
                    return(false);
                }
                else
                {
                    RemoveMissingMessage(id);
                }
            }
            else
            {
                if (id > lastMessageID + 1)
                {
                    for (ushort i = (ushort)(lastMessageID + 1); i < id; i++)
                    {
                        QueueMissingMessage(i);
                    }
                }
                //received an old message and it wasn't marked as missed, lets ignore it
                else if (id <= lastMessageID && !missingMessages.ContainsKey(id))
                {
                    Debug.WriteLine("old already received message, ignore");
                    return(false);
                }
                else
                {
                    RemoveMissingMessage(id);
                }

                lastMessageID = Math.Max(lastMessageID, id);
            }

            return(true);
        }