Send order queue length in ping responses.
This commit is contained in:
@@ -304,12 +304,11 @@ namespace OpenRA.Network
|
||||
orderManager.ReceiveDisconnect(disconnect.ClientId, disconnect.Frame);
|
||||
else if (OrderIO.TryParseSync(p.Data, out var sync))
|
||||
orderManager.ReceiveSync(sync);
|
||||
else if (OrderIO.TryParsePing(p.FromClient, p.Data, out var ping))
|
||||
else if (OrderIO.TryParsePingRequest(p, out var timestamp))
|
||||
{
|
||||
// The Ping packet is sent back directly without changes
|
||||
// Note that processing this here, rather than in NetworkConnectionReceive,
|
||||
// so that poor world tick performance can be reflected in the latency measurement
|
||||
Send(ping);
|
||||
Send(OrderIO.SerializePingResponse(timestamp, (byte)orderManager.OrderQueueLength));
|
||||
record = false;
|
||||
}
|
||||
else if (OrderIO.TryParseAck(p, out var ackFrame, out var ackCount))
|
||||
|
||||
@@ -93,6 +93,16 @@ namespace OpenRA.Network
|
||||
return ms.GetBuffer();
|
||||
}
|
||||
|
||||
public static byte[] SerializePingResponse(long timestamp, byte queueLength)
|
||||
{
|
||||
var ms = new MemoryStream(14);
|
||||
ms.WriteArray(BitConverter.GetBytes(0));
|
||||
ms.WriteByte((byte)OrderType.Ping);
|
||||
ms.WriteArray(BitConverter.GetBytes(timestamp));
|
||||
ms.WriteByte(queueLength);
|
||||
return ms.GetBuffer();
|
||||
}
|
||||
|
||||
public static bool TryParseDisconnect((int FromClient, byte[] Data) packet, out (int Frame, int ClientId) disconnect)
|
||||
{
|
||||
// Valid Disconnect packets are only ever generated by the server
|
||||
@@ -123,24 +133,24 @@ namespace OpenRA.Network
|
||||
return true;
|
||||
}
|
||||
|
||||
public static bool TryParsePing(int fromClient, byte[] packet, out byte[] ping)
|
||||
public static bool TryParsePingRequest((int FromClient, byte[] Data) packet, out long timestamp)
|
||||
{
|
||||
// Valid Ping packets are only ever generated by the server
|
||||
if (fromClient != 0 || packet.Length != 13 || packet[4] != (byte)OrderType.Ping)
|
||||
// Valid Ping requests are only ever generated by the server
|
||||
if (packet.FromClient != 0 || packet.Data.Length != 13 || packet.Data[4] != (byte)OrderType.Ping)
|
||||
{
|
||||
ping = null;
|
||||
timestamp = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Valid Ping packets always have frame 0
|
||||
var frame = BitConverter.ToInt32(packet, 0);
|
||||
var frame = BitConverter.ToInt32(packet.Data, 0);
|
||||
if (frame != 0)
|
||||
{
|
||||
ping = null;
|
||||
timestamp = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
ping = packet;
|
||||
timestamp = BitConverter.ToInt64(packet.Data, 5);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@ namespace OpenRA.Network
|
||||
public Session LobbyInfo = new Session();
|
||||
public Session.Client LocalClient => LobbyInfo.ClientWithIndex(Connection.LocalClientId);
|
||||
public World World;
|
||||
public int OrderQueueLength => pendingOrders.Count > 0 ? pendingOrders.Min(q => q.Value.Count) : 0;
|
||||
|
||||
public string ServerError = null;
|
||||
public bool AuthenticationFailed = false;
|
||||
|
||||
Reference in New Issue
Block a user