diff --git a/Lidgren.Network/NetConnectionStatistics.cs b/Lidgren.Network/NetConnectionStatistics.cs index 791afed..d993d06 100644 --- a/Lidgren.Network/NetConnectionStatistics.cs +++ b/Lidgren.Network/NetConnectionStatistics.cs @@ -45,6 +45,7 @@ namespace Lidgren.Network internal long m_sentMessages; internal long m_receivedMessages; + internal long m_droppedMessages; internal long m_receivedFragments; internal long m_sentBytes; @@ -99,35 +100,20 @@ namespace Lidgren.Network // public double LastSendRespondedTo { get { return m_connection.m_lastSendRespondedTo; } } -#if USE_RELEASE_STATISTICS - internal void PacketSent(int numBytes, int numMessages) - { - NetException.Assert(numBytes > 0 && numMessages > 0); - m_sentPackets++; - m_sentBytes += numBytes; - m_sentMessages += numMessages; - } -#else +#if !USE_RELEASE_STATISTICS [Conditional("DEBUG")] - internal void PacketSent(int numBytes, int numMessages) - { - NetException.Assert(numBytes > 0 && numMessages > 0); - m_sentPackets++; - m_sentBytes += numBytes; - m_sentMessages += numMessages; - } #endif - -#if USE_RELEASE_STATISTICS - internal void PacketReceived(int numBytes, int numMessages) + internal void PacketSent(int numBytes, int numMessages) { NetException.Assert(numBytes > 0 && numMessages > 0); - m_receivedPackets++; - m_receivedBytes += numBytes; - m_receivedMessages += numMessages; + m_sentPackets++; + m_sentBytes += numBytes; + m_sentMessages += numMessages; } -#else + +#if !USE_RELEASE_STATISTICS [Conditional("DEBUG")] +#endif internal void PacketReceived(int numBytes, int numMessages, int numFragments) { NetException.Assert(numBytes > 0 && numMessages > 0); @@ -136,18 +122,10 @@ namespace Lidgren.Network m_receivedMessages += numMessages; m_receivedFragments += numFragments; } -#endif -#if USE_RELEASE_STATISTICS - internal void MessageResent(MessageResendReason reason) - { - if (reason == MessageResendReason.Delay) - m_resentMessagesDueToDelay++; - else - m_resentMessagesDueToHole++; - } -#else +#if !USE_RELEASE_STATISTICS [Conditional("DEBUG")] +#endif internal void MessageResent(MessageResendReason reason) { if (reason == MessageResendReason.Delay) @@ -155,7 +133,14 @@ namespace Lidgren.Network else m_resentMessagesDueToHole++; } + +#if !USE_RELEASE_STATISTICS + [Conditional("DEBUG")] #endif + internal void MessageDropped() + { + m_droppedMessages++; + } /// /// Returns a string that represents this object @@ -167,6 +152,7 @@ namespace Lidgren.Network bdr.AppendLine("Current MTU: " + m_connection.m_currentMTU); bdr.AppendLine("Sent " + m_sentBytes + " bytes in " + m_sentMessages + " messages in " + m_sentPackets + " packets"); bdr.AppendLine("Received " + m_receivedBytes + " bytes in " + m_receivedMessages + " messages (of which " + m_receivedFragments + " fragments) in " + m_receivedPackets + " packets"); + bdr.AppendLine("Dropped " + m_droppedMessages + " messages (dupes/late/early)"); if (m_resentMessagesDueToDelay > 0) bdr.AppendLine("Resent messages (delay): " + m_resentMessagesDueToDelay); diff --git a/Lidgren.Network/NetPeer.Internal.cs b/Lidgren.Network/NetPeer.Internal.cs index aa7576a..4a44a3a 100644 --- a/Lidgren.Network/NetPeer.Internal.cs +++ b/Lidgren.Network/NetPeer.Internal.cs @@ -490,7 +490,8 @@ namespace Lidgren.Network bool isFragment = ((low & 1) == 1); ushort sequenceNumber = (ushort)((low >> 1) | (((int)high) << 7)); - numFragments++; + if (isFragment) + numFragments++; ushort payloadBitLength = (ushort)(m_receiveBuffer[ptr++] | (m_receiveBuffer[ptr++] << 8)); int payloadByteLength = NetUtility.BytesToHoldBits(payloadBitLength); diff --git a/Lidgren.Network/NetPeerStatistics.cs b/Lidgren.Network/NetPeerStatistics.cs index 67d217e..841bf0f 100644 --- a/Lidgren.Network/NetPeerStatistics.cs +++ b/Lidgren.Network/NetPeerStatistics.cs @@ -107,32 +107,19 @@ namespace Lidgren.Network /// public int BytesInRecyclePool { get { return m_peer.m_storagePoolBytes; } } -#if USE_RELEASE_STATISTICS - internal void PacketSent(int numBytes, int numMessages) - { - m_sentPackets++; - m_sentBytes += numBytes; - m_sentMessages += numMessages; - } -#else +#if !USE_RELEASE_STATISTICS [Conditional("DEBUG")] - internal void PacketSent(int numBytes, int numMessages) - { - m_sentPackets++; - m_sentBytes += numBytes; - m_sentMessages += numMessages; - } #endif - -#if USE_RELEASE_STATISTICS - internal void PacketReceived(int numBytes, int numMessages) + internal void PacketSent(int numBytes, int numMessages) { - m_receivedPackets++; - m_receivedBytes += numBytes; - m_receivedMessages += numMessages; + m_sentPackets++; + m_sentBytes += numBytes; + m_sentMessages += numMessages; } -#else + +#if !USE_RELEASE_STATISTICS [Conditional("DEBUG")] +#endif internal void PacketReceived(int numBytes, int numMessages, int numFragments) { m_receivedPackets++; @@ -140,7 +127,6 @@ namespace Lidgren.Network m_receivedMessages += numMessages; m_receivedFragments += numFragments; } -#endif /// /// Returns a string that represents this object diff --git a/Lidgren.Network/NetReliableOrderedReceiver.cs b/Lidgren.Network/NetReliableOrderedReceiver.cs index 691e5f2..c82dfcb 100644 --- a/Lidgren.Network/NetReliableOrderedReceiver.cs +++ b/Lidgren.Network/NetReliableOrderedReceiver.cs @@ -66,8 +66,9 @@ namespace Lidgren.Network if (relate < 0) { - m_peer.LogVerbose("Received message #" + message.m_sequenceNumber + " DROPPING DUPLICATE"); // duplicate + m_connection.m_statistics.MessageDropped(); + m_peer.LogVerbose("Received message #" + message.m_sequenceNumber + " DROPPING DUPLICATE"); return; } @@ -75,6 +76,7 @@ namespace Lidgren.Network if (relate > m_windowSize) { // too early message! + m_connection.m_statistics.MessageDropped(); m_peer.LogDebug("Received " + message + " TOO EARLY! Expected " + m_windowStart); return; } diff --git a/Lidgren.Network/NetReliableSequencedReceiver.cs b/Lidgren.Network/NetReliableSequencedReceiver.cs index c08d8ab..464f52c 100644 --- a/Lidgren.Network/NetReliableSequencedReceiver.cs +++ b/Lidgren.Network/NetReliableSequencedReceiver.cs @@ -42,6 +42,7 @@ namespace Lidgren.Network if (relate < 0) { + m_connection.m_statistics.MessageDropped(); m_peer.LogVerbose("Received message #" + message.m_sequenceNumber + " DROPPING LATE or DUPE"); return; } @@ -50,6 +51,7 @@ namespace Lidgren.Network if (relate > m_windowSize) { // too early message! + m_connection.m_statistics.MessageDropped(); m_peer.LogDebug("Received " + message + " TOO EARLY! Expected " + m_windowStart); return; } diff --git a/Lidgren.Network/NetReliableUnorderedReceiver.cs b/Lidgren.Network/NetReliableUnorderedReceiver.cs index 876e3bd..23b864b 100644 --- a/Lidgren.Network/NetReliableUnorderedReceiver.cs +++ b/Lidgren.Network/NetReliableUnorderedReceiver.cs @@ -65,6 +65,7 @@ namespace Lidgren.Network if (relate < 0) { // duplicate + m_connection.m_statistics.MessageDropped(); m_peer.LogVerbose("Received message #" + message.m_sequenceNumber + " DROPPING DUPLICATE"); return; } @@ -73,10 +74,19 @@ namespace Lidgren.Network if (relate > m_windowSize) { // too early message! + m_connection.m_statistics.MessageDropped(); m_peer.LogDebug("Received " + message + " TOO EARLY! Expected " + m_windowStart); return; } + if (m_earlyReceived.Get(message.m_sequenceNumber % m_windowSize)) + { + // duplicate + m_connection.m_statistics.MessageDropped(); + m_peer.LogVerbose("Received message #" + message.m_sequenceNumber + " DROPPING DUPLICATE"); + return; + } + m_earlyReceived.Set(message.m_sequenceNumber % m_windowSize, true); //m_peer.LogVerbose("Received " + message + " WITHHOLDING, waiting for " + m_windowStart); //m_withheldMessages[message.m_sequenceNumber % m_windowSize] = message; diff --git a/Lidgren.Network/NetUnreliableSequencedReceiver.cs b/Lidgren.Network/NetUnreliableSequencedReceiver.cs index 92d961c..d3098f5 100644 --- a/Lidgren.Network/NetUnreliableSequencedReceiver.cs +++ b/Lidgren.Network/NetUnreliableSequencedReceiver.cs @@ -20,7 +20,11 @@ namespace Lidgren.Network int relate = NetUtility.RelativeSequenceNumber(nr, m_lastReceivedSequenceNumber + 1); if (relate < 0) + { + m_connection.m_statistics.MessageDropped(); + m_peer.LogVerbose("Received message #" + nr + " DROPPING DUPLICATE"); return; // drop if late + } m_lastReceivedSequenceNumber = nr; m_peer.ReleaseMessage(msg);