change IConnection interface wrt sending
This commit is contained in:
@@ -30,7 +30,9 @@ namespace OpenRA.Network
|
|||||||
{
|
{
|
||||||
int LocalClientId { get; }
|
int LocalClientId { get; }
|
||||||
ConnectionState ConnectionState { get; }
|
ConnectionState ConnectionState { get; }
|
||||||
void Send( byte[] packet );
|
void Send( int frame, List<byte[]> orders );
|
||||||
|
void SendImmediate( List<byte[]> orders );
|
||||||
|
void SendSync( int frame, byte[] syncData );
|
||||||
void Receive( Action<int, byte[]> packetFn );
|
void Receive( Action<int, byte[]> packetFn );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,7 +55,33 @@ namespace OpenRA.Network
|
|||||||
get { return ConnectionState.PreConnecting; }
|
get { return ConnectionState.PreConnecting; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void Send( byte[] packet )
|
public void Send( int frame, List<byte[]> orders )
|
||||||
|
{
|
||||||
|
var ms = new MemoryStream();
|
||||||
|
ms.Write( BitConverter.GetBytes( frame ) );
|
||||||
|
foreach( var o in orders )
|
||||||
|
ms.Write( o );
|
||||||
|
Send( ms.ToArray() );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendImmediate( List<byte[]> orders )
|
||||||
|
{
|
||||||
|
var ms = new MemoryStream();
|
||||||
|
ms.Write( BitConverter.GetBytes( (int)0 ) );
|
||||||
|
foreach( var o in orders )
|
||||||
|
ms.Write( o );
|
||||||
|
Send( ms.ToArray() );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendSync( int frame, byte[] syncData )
|
||||||
|
{
|
||||||
|
var ms = new MemoryStream();
|
||||||
|
ms.Write( BitConverter.GetBytes( frame ) );
|
||||||
|
ms.Write( syncData );
|
||||||
|
Send( ms.ToArray() );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void Send( byte[] packet )
|
||||||
{
|
{
|
||||||
if( packet.Length == 0 )
|
if( packet.Length == 0 )
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
@@ -129,7 +157,7 @@ namespace OpenRA.Network
|
|||||||
public override int LocalClientId { get { return clientId; } }
|
public override int LocalClientId { get { return clientId; } }
|
||||||
public override ConnectionState ConnectionState { get { return connectionState; } }
|
public override ConnectionState ConnectionState { get { return connectionState; } }
|
||||||
|
|
||||||
public override void Send( byte[] packet )
|
protected override void Send( byte[] packet )
|
||||||
{
|
{
|
||||||
base.Send( packet );
|
base.Send( packet );
|
||||||
|
|
||||||
|
|||||||
@@ -22,22 +22,6 @@ namespace OpenRA.Network
|
|||||||
s.Write(buf, 0, buf.Length);
|
s.Write(buf, 0, buf.Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void WriteFrameData(this Stream s, IEnumerable<Order> orders, int frameNumber)
|
|
||||||
{
|
|
||||||
var bytes = Serialize( orders, frameNumber );
|
|
||||||
s.Write( BitConverter.GetBytes( (int)bytes.Length ) );
|
|
||||||
s.Write( bytes );
|
|
||||||
}
|
|
||||||
|
|
||||||
public static byte[] Serialize( this IEnumerable<Order> orders, int frameNumber )
|
|
||||||
{
|
|
||||||
var ms = new MemoryStream();
|
|
||||||
ms.Write( BitConverter.GetBytes( frameNumber ) );
|
|
||||||
foreach( var o in orders.Select( o => o.Serialize() ) )
|
|
||||||
ms.Write( o );
|
|
||||||
return ms.ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static List<Order> ToOrderList(this byte[] bytes, World world)
|
public static List<Order> ToOrderList(this byte[] bytes, World world)
|
||||||
{
|
{
|
||||||
var ms = new MemoryStream(bytes, 4, bytes.Length - 4);
|
var ms = new MemoryStream(bytes, 4, bytes.Length - 4);
|
||||||
@@ -52,12 +36,11 @@ namespace OpenRA.Network
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] SerializeSync( this List<int> sync, int frameNumber )
|
public static byte[] SerializeSync( this List<int> sync )
|
||||||
{
|
{
|
||||||
var ms = new MemoryStream();
|
var ms = new MemoryStream();
|
||||||
using( var writer = new BinaryWriter( ms ) )
|
using( var writer = new BinaryWriter( ms ) )
|
||||||
{
|
{
|
||||||
writer.Write( frameNumber );
|
|
||||||
writer.Write( (byte)0x65 );
|
writer.Write( (byte)0x65 );
|
||||||
foreach( var s in sync )
|
foreach( var s in sync )
|
||||||
writer.Write( s );
|
writer.Write( s );
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ namespace OpenRA.Network
|
|||||||
|
|
||||||
NetFrameNumber = 1;
|
NetFrameNumber = 1;
|
||||||
for( int i = NetFrameNumber ; i <= FramesAhead ; i++ )
|
for( int i = NetFrameNumber ; i <= FramesAhead ; i++ )
|
||||||
Connection.Send( new List<Order>().Serialize( i ) );
|
Connection.Send( i, new List<byte[]>() );
|
||||||
}
|
}
|
||||||
|
|
||||||
public OrderManager( string host, int port, IConnection conn )
|
public OrderManager( string host, int port, IConnection conn )
|
||||||
@@ -73,7 +73,7 @@ namespace OpenRA.Network
|
|||||||
{
|
{
|
||||||
var immediateOrders = localOrders.Where( o => o.IsImmediate ).ToList();
|
var immediateOrders = localOrders.Where( o => o.IsImmediate ).ToList();
|
||||||
if( immediateOrders.Count != 0 )
|
if( immediateOrders.Count != 0 )
|
||||||
Connection.Send( immediateOrders.Serialize( 0 ) );
|
Connection.SendImmediate( immediateOrders.Select( o => o.Serialize() ).ToList() );
|
||||||
localOrders.RemoveAll( o => o.IsImmediate );
|
localOrders.RemoveAll( o => o.IsImmediate );
|
||||||
|
|
||||||
var immediatePackets = new List<Pair<int, byte[]>>();
|
var immediatePackets = new List<Pair<int, byte[]>>();
|
||||||
@@ -156,7 +156,7 @@ namespace OpenRA.Network
|
|||||||
if( !IsReadyForNextFrame )
|
if( !IsReadyForNextFrame )
|
||||||
throw new InvalidOperationException();
|
throw new InvalidOperationException();
|
||||||
|
|
||||||
Connection.Send( localOrders.Serialize( NetFrameNumber + FramesAhead ) );
|
Connection.Send( NetFrameNumber + FramesAhead, localOrders.Select( o => o.Serialize() ).ToList() );
|
||||||
localOrders.Clear();
|
localOrders.Clear();
|
||||||
|
|
||||||
var sync = new List<int>();
|
var sync = new List<int>();
|
||||||
@@ -168,8 +168,8 @@ namespace OpenRA.Network
|
|||||||
sync.Add( world.SyncHash() );
|
sync.Add( world.SyncHash() );
|
||||||
}
|
}
|
||||||
|
|
||||||
var ss = sync.SerializeSync( NetFrameNumber );
|
var ss = sync.SerializeSync();
|
||||||
Connection.Send( ss );
|
Connection.SendSync( NetFrameNumber, ss );
|
||||||
|
|
||||||
syncReport.UpdateSyncReport();
|
syncReport.UpdateSyncReport();
|
||||||
|
|
||||||
|
|||||||
@@ -26,10 +26,10 @@ namespace OpenRA.Network
|
|||||||
get { return ConnectionState.Connected; }
|
get { return ConnectionState.Connected; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Send( byte[] packet )
|
// do nothing; ignore locally generated orders
|
||||||
{
|
public void Send( int frame, List<byte[]> orders ) { }
|
||||||
// do nothing; ignore locally generated orders
|
public void SendImmediate( List<byte[]> orders ) { }
|
||||||
}
|
public void SendSync( int frame, byte[] syncData ) { }
|
||||||
|
|
||||||
public void Receive( Action<int, byte[]> packetFn )
|
public void Receive( Action<int, byte[]> packetFn )
|
||||||
{
|
{
|
||||||
@@ -63,10 +63,9 @@ namespace OpenRA.Network
|
|||||||
public int LocalClientId { get { return inner.LocalClientId; } }
|
public int LocalClientId { get { return inner.LocalClientId; } }
|
||||||
public ConnectionState ConnectionState { get { return inner.ConnectionState; } }
|
public ConnectionState ConnectionState { get { return inner.ConnectionState; } }
|
||||||
|
|
||||||
public void Send( byte[] packet )
|
public void Send( int frame, List<byte[]> orders ) { inner.Send( frame, orders ); }
|
||||||
{
|
public void SendImmediate( List<byte[]> orders ) { inner.SendImmediate( orders ); }
|
||||||
inner.Send( packet );
|
public void SendSync( int frame, byte[] syncData ) { inner.SendSync( frame, syncData ); }
|
||||||
}
|
|
||||||
|
|
||||||
public void Receive( Action<int, byte[]> packetFn )
|
public void Receive( Action<int, byte[]> packetFn )
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user