1
0
mirror of https://github.com/lidgren/lidgren-network-gen3.git synced 2026-05-18 16:16:35 +09:00

Fix for fragmented messages and ReliableOrdered

This commit is contained in:
lidgren
2010-06-15 22:37:30 +00:00
parent 5d44e391cb
commit a12fc42732
4 changed files with 36 additions and 12 deletions

View File

@@ -233,7 +233,7 @@ namespace Lidgren.Network
} }
} }
private void ExpectedReliableSequenceArrived(int reliableSlot) private void ExpectedReliableSequenceArrived(int reliableSlot, bool isFragment)
{ {
NetBitVector received = m_reliableReceived[reliableSlot]; NetBitVector received = m_reliableReceived[reliableSlot];
@@ -275,7 +275,10 @@ namespace Lidgren.Network
// Found withheld message due for delivery // Found withheld message due for delivery
m_owner.LogVerbose("Releasing withheld message " + wm); m_owner.LogVerbose("Releasing withheld message " + wm);
// AcceptMessage //Console.WriteLine("Releasing withheld message " + wm);
// Accept, unless a fragment
if (wm.m_fragmentationInfo == null)
m_owner.ReleaseMessage(wm); m_owner.ReleaseMessage(wm);
foundWithheld = true; foundWithheld = true;
@@ -290,7 +293,13 @@ namespace Lidgren.Network
} }
} }
if (!foundWithheld) if (!foundWithheld)
throw new NetException("Failed to find withheld message!"); {
// probably a fragment; we don't withhold those - advance anyway
//Console.WriteLine("Withheld #" + nextExpected + " not found; probably a fragment!");
//received[(nextExpected + (NetConstants.NumSequenceNumbers / 2)) % NetConstants.NumSequenceNumbers] = false; // reset for next pass
//nextExpected = (nextExpected + 1) % NetConstants.NumSequenceNumbers;
throw new NetException("Withheld message not found!");
}
} }
} }

View File

@@ -339,7 +339,7 @@ namespace Lidgren.Network
// Expected sequence number // Expected sequence number
AcceptMessage(mtp, isFragment, channelSequenceNumber, ptr, payloadLengthBits); AcceptMessage(mtp, isFragment, channelSequenceNumber, ptr, payloadLengthBits);
ExpectedReliableSequenceArrived(reliableSlot); ExpectedReliableSequenceArrived(reliableSlot, isFragment);
return; return;
} }
@@ -498,7 +498,10 @@ namespace Lidgren.Network
Buffer.BlockCopy(m_owner.m_receiveBuffer, ptr, im.m_data, offset, payloadLength); Buffer.BlockCopy(m_owner.m_receiveBuffer, ptr, im.m_data, offset, payloadLength);
im.m_bitLength = (8 * (offset + payloadLength)); // only enlarge message length if this is latest fragment received
int newBitLength = (8 * (offset + payloadLength));
if (newBitLength > im.m_bitLength)
im.m_bitLength = newBitLength;
info.Received[nr] = true; info.Received[nr] = true;
info.TotalReceived++; info.TotalReceived++;

View File

@@ -438,7 +438,17 @@ namespace Lidgren.Network
} }
byte[] bytes = Encoding.UTF8.GetBytes(source); byte[] bytes = Encoding.UTF8.GetBytes(source);
InternalEnsureBufferSize(m_bitLength + (bytes.Length > 127 ? 2 * 8 : 1 * 8) + (bytes.Length * 8));
// determine number of bytes to store length
int lenBytesNeeded = 1;
uint num1 = (uint)bytes.Length;
while (num1 >= 0x80)
{
num1 = num1 >> 7;
lenBytesNeeded++;
}
InternalEnsureBufferSize(m_bitLength + ((bytes.Length + lenBytesNeeded) * 8));
WriteVariableUInt32((uint)bytes.Length); WriteVariableUInt32((uint)bytes.Length);
Write(bytes); Write(bytes);
} }

View File

@@ -49,6 +49,8 @@ namespace Lidgren.Network
{ {
NetException.Assert(msg.m_status != NetIncomingMessageReleaseStatus.ReleasedToApplication, "Message released to application twice!"); NetException.Assert(msg.m_status != NetIncomingMessageReleaseStatus.ReleasedToApplication, "Message released to application twice!");
NetException.Assert(msg.m_fragmentationInfo == null, "Fragment released to application!");
msg.m_status = NetIncomingMessageReleaseStatus.ReleasedToApplication; msg.m_status = NetIncomingMessageReleaseStatus.ReleasedToApplication;
m_releasedIncomingMessages.Enqueue(msg); m_releasedIncomingMessages.Enqueue(msg);
if (m_messageReceivedEvent != null) if (m_messageReceivedEvent != null)