ConnectionInterface MessageReading

This commit is contained in:
Garry Newman 2019-05-06 12:02:36 +01:00
parent 14d947c7ba
commit f77332a41f
2 changed files with 58 additions and 23 deletions

View File

@ -40,7 +40,6 @@ namespace Steamworks
si.Close(); si.Close();
} }
[TestMethod] [TestMethod]
public async Task RelayEndtoEnd() public async Task RelayEndtoEnd()
{ {
@ -103,6 +102,20 @@ namespace Steamworks
await Task.Delay( 10 ); await Task.Delay( 10 );
} }
} }
public override unsafe void OnMessage( IntPtr data, int size, long messageNum, SteamNetworkingMicroseconds recvTime, int channel )
{
// We're only sending strings, so it's fine to read this like this
var str = UTF8Encoding.UTF8.GetString( (byte*) data, size );
Console.WriteLine( $"[Connection][{messageNum}][{recvTime}][{channel}] \"{str}\"" );
if ( str.StartsWith( "Hello" ) )
{
Connection.SendMessage( "Hello, How are you!?" );
}
}
} }
@ -150,7 +163,15 @@ namespace Steamworks
var singleClient = Connected.First(); var singleClient = Connected.First();
singleClient.SendMessage( "Hello Client" ); singleClient.SendMessage( "Hey?" );
await Task.Delay( 1000 );
singleClient.SendMessage( "Anyone?" );
await Task.Delay( 100 );
singleClient.SendMessage( "What's this?" );
await Task.Delay( 10 );
singleClient.SendMessage( "Greetings!!??" );
await Task.Delay( 300 );
singleClient.SendMessage( "Hello Client!?" );
await Task.Delay( 1000 ); await Task.Delay( 1000 );

View File

@ -1,7 +1,6 @@
using System; using Steamworks.Data;
using System.Collections.Generic; using System;
using System.IO; using System.Runtime.InteropServices;
using Steamworks.Data;
namespace Steamworks namespace Steamworks
{ {
@ -67,37 +66,52 @@ namespace Steamworks
Connected = false; Connected = false;
} }
SteamNetworkingMessage_t[] messageBuffer; public void Receive( int bufferSize = 32 )
public void Receive()
{ {
if ( messageBuffer == null ) // #32bit
{ int processed = 0;
messageBuffer = new SteamNetworkingMessage_t[128]; IntPtr messageBuffer = Marshal.AllocHGlobal( 8 * bufferSize );
}
var processed = SteamNetworkingSockets.Internal.ReceiveMessagesOnConnection( Connection, ref messageBuffer, messageBuffer.Length ); try
{
processed = SteamNetworkingSockets.Internal.ReceiveMessagesOnConnection( Connection, messageBuffer, bufferSize );
for ( int i = 0; i < processed; i++ ) for ( int i = 0; i < processed; i++ )
{ {
Console.WriteLine( "FOUND SOME!" ); ReceiveMessage( Marshal.ReadIntPtr( messageBuffer, i ) );
ReceiveMessage( messageBuffer[i] ); }
}
finally
{
Marshal.FreeHGlobal( messageBuffer );
} }
// //
// Overwhelmed our buffer, keep going // Overwhelmed our buffer, keep going
// //
if ( processed == messageBuffer.Length ) if ( processed == bufferSize )
Receive(); Receive( bufferSize );
} }
internal unsafe void ReceiveMessage( SteamNetworkingMessage_t msg ) internal unsafe void ReceiveMessage( IntPtr msgPtr )
{ {
var stream = new UnmanagedMemoryStream( (byte*)msg.data, msg.length, msg.length, FileAccess.Read ); var msg = Marshal.PtrToStructure<NetMsg>( msgPtr );
try
{
OnMessage( msg.DataPtr, msg.DataSize, msg.TimeRecv, msg.MessageNumber, msg.Channel );
}
finally
{
//
// Releases the message
//
msg.Release( msgPtr );
}
}
// read Message public virtual void OnMessage( IntPtr data, int size, long messageNum, SteamNetworkingMicroseconds recvTime, int channel )
{
msg.release.Invoke( ref msg );
} }
} }
} }