You've already forked lidgren-network-gen3
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:
@@ -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,8 +275,11 @@ 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);
|
||||||
m_owner.ReleaseMessage(wm);
|
|
||||||
|
// Accept, unless a fragment
|
||||||
|
if (wm.m_fragmentationInfo == null)
|
||||||
|
m_owner.ReleaseMessage(wm);
|
||||||
|
|
||||||
foundWithheld = true;
|
foundWithheld = true;
|
||||||
withheldList.Remove(wm);
|
withheldList.Remove(wm);
|
||||||
@@ -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!");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -233,7 +233,7 @@ namespace Lidgren.Network
|
|||||||
|
|
||||||
ptr = msg.Encode(now, buffer, ptr, this);
|
ptr = msg.Encode(now, buffer, ptr, this);
|
||||||
numIncludedMessages++;
|
numIncludedMessages++;
|
||||||
|
|
||||||
// room to piggyback some acks?
|
// room to piggyback some acks?
|
||||||
if (m_acknowledgesToSend.Count > 0)
|
if (m_acknowledgesToSend.Count > 0)
|
||||||
{
|
{
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -404,7 +404,7 @@ namespace Lidgren.Network
|
|||||||
im.m_senderEndpoint = m_remoteEndpoint;
|
im.m_senderEndpoint = m_remoteEndpoint;
|
||||||
|
|
||||||
m_owner.LogVerbose("Withholding " + im + " (waiting for " + m_nextExpectedReliableSequence[reliableSlot] + ")");
|
m_owner.LogVerbose("Withholding " + im + " (waiting for " + m_nextExpectedReliableSequence[reliableSlot] + ")");
|
||||||
|
|
||||||
wmList.Add(im);
|
wmList.Add(im);
|
||||||
|
|
||||||
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++;
|
||||||
@@ -567,7 +570,7 @@ namespace Lidgren.Network
|
|||||||
throw new NetException("Message has already been sent!");
|
throw new NetException("Message has already been sent!");
|
||||||
|
|
||||||
NetException.Assert(sequenceChannel >= 0 && sequenceChannel < NetConstants.NetChannelsPerDeliveryMethod, "Sequence channel must be between 0 and NetConstants.NetChannelsPerDeliveryMethod (" + NetConstants.NetChannelsPerDeliveryMethod + ")");
|
NetException.Assert(sequenceChannel >= 0 && sequenceChannel < NetConstants.NetChannelsPerDeliveryMethod, "Sequence channel must be between 0 and NetConstants.NetChannelsPerDeliveryMethod (" + NetConstants.NetChannelsPerDeliveryMethod + ")");
|
||||||
|
|
||||||
msg.m_type = (NetMessageType)((int)method + sequenceChannel);
|
msg.m_type = (NetMessageType)((int)method + sequenceChannel);
|
||||||
EnqueueOutgoingMessage(msg);
|
EnqueueOutgoingMessage(msg);
|
||||||
}
|
}
|
||||||
@@ -602,7 +605,7 @@ namespace Lidgren.Network
|
|||||||
|
|
||||||
int numFragments = (msgLen + mtu - 1) / mtu;
|
int numFragments = (msgLen + mtu - 1) / mtu;
|
||||||
|
|
||||||
for(int i=0;i<numFragments;i++)
|
for (int i = 0; i < numFragments; i++)
|
||||||
{
|
{
|
||||||
int flen = (i == numFragments - 1 ? (msgLen - (mtu * (numFragments - 1))) : mtu);
|
int flen = (i == numFragments - 1 ? (msgLen - (mtu * (numFragments - 1))) : mtu);
|
||||||
|
|
||||||
@@ -684,4 +687,4 @@ namespace Lidgren.Network
|
|||||||
return "[NetConnection to " + m_remoteEndpoint + " Status: " + m_visibleStatus + "]";
|
return "[NetConnection to " + m_remoteEndpoint + " Status: " + m_visibleStatus + "]";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user