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; }
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); }