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

Reliability fix; first sequenced message was swallowed

This commit is contained in:
lidgren
2010-07-15 05:41:53 +00:00
parent cf74d35cd8
commit 11d33aa446
4 changed files with 33 additions and 10 deletions

View File

@@ -84,15 +84,16 @@ namespace Lidgren.Network
/// <summary>
/// Sends message to server
/// </summary>
public void SendMessage(NetOutgoingMessage msg, NetDeliveryMethod method, int sequenceChannel)
public bool SendMessage(NetOutgoingMessage msg, NetDeliveryMethod method, int sequenceChannel)
{
NetConnection serverConnection = ServerConnection;
if (serverConnection == null)
{
//LogError("Cannot send message, no server connection!");
return;
return false;
}
serverConnection.SendMessage(msg, method, sequenceChannel);
return serverConnection.SendMessage(msg, method, sequenceChannel);
}
public override string ToString()

View File

@@ -63,11 +63,16 @@ namespace Lidgren.Network
int num = ((int)NetMessageType.UserReliableOrdered + NetConstants.NetChannelsPerDeliveryMethod) - (int)NetMessageType.UserSequenced;
m_nextSendSequenceNumber = new int[num];
m_lastReceivedSequenced = new ushort[num];
for (int i = 0; i < m_lastReceivedSequenced.Length; i++)
m_lastReceivedSequenced[i] = ushort.MaxValue;
m_nextForceAckTime = double.MaxValue;
}
internal ushort GetSendSequenceNumber(NetMessageType mtp)
{
if (mtp < NetMessageType.UserSequenced)
return 0;
int slot = (int)mtp - (int)NetMessageType.UserSequenced;
int retval;
lock (m_nextSendSequenceNumber)

View File

@@ -625,10 +625,23 @@ namespace Lidgren.Network
if (msg.IsSent)
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 + ")");
if (method <= NetDeliveryMethod.Unknown || method > NetDeliveryMethod.ReliableOrdered)
throw new NetException("Bad delivery method!");
switch (method)
{
case NetDeliveryMethod.Unreliable:
case NetDeliveryMethod.ReliableUnordered:
if (sequenceChannel != 0)
throw new NetException("Delivery method " + method + " cannot use sequence channels other than 0!");
break;
case NetDeliveryMethod.ReliableOrdered:
case NetDeliveryMethod.ReliableSequenced:
case NetDeliveryMethod.UnreliableSequenced:
NetException.Assert(sequenceChannel >= 0 && sequenceChannel < NetConstants.NetChannelsPerDeliveryMethod, "Sequence channel must be between 0 and NetConstants.NetChannelsPerDeliveryMethod (" + NetConstants.NetChannelsPerDeliveryMethod + ")");
break;
case NetDeliveryMethod.Unknown:
default:
throw new NetException("Bad delivery method!");
break;
}
if (m_owner == null)
return false; // we've been disposed

View File

@@ -76,14 +76,14 @@ namespace UnitTests
test.Name = "Hallon";
test.Age = 8.2f;
tmp.WriteAllFields(test);
tmp.WriteAllFields(test, BindingFlags.Public | BindingFlags.Instance);
data = tmp.PeekDataBuffer();
inc = Program.CreateIncomingMessage(data, tmp.LengthBits);
Test readTest = new Test();
inc.ReadAllFields(readTest);
inc.ReadAllFields(readTest, BindingFlags.Public | BindingFlags.Instance);
NetException.Assert(readTest.Number == 42);
NetException.Assert(readTest.Name == "Hallon");
@@ -110,9 +110,13 @@ namespace UnitTests
}
}
public class Test
public class TestBase
{
public int Number;
}
public class Test : TestBase
{
public float Age;
public string Name;
}