change IConnection interface wrt sending

This commit is contained in:
Bob
2010-10-16 20:59:16 +13:00
parent 2d2220f38f
commit c2b3a749ca
4 changed files with 44 additions and 34 deletions

View File

@@ -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 );

View File

@@ -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 );

View File

@@ -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();

View File

@@ -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 )
{ {