diff --git a/Facepunch.Steamworks.Test/NetworkingSockets.cs b/Facepunch.Steamworks.Test/NetworkingSockets.cs index 80aafbf..9006a3e 100644 --- a/Facepunch.Steamworks.Test/NetworkingSockets.cs +++ b/Facepunch.Steamworks.Test/NetworkingSockets.cs @@ -40,7 +40,6 @@ namespace Steamworks si.Close(); } - [TestMethod] public async Task RelayEndtoEnd() { @@ -103,6 +102,20 @@ namespace Steamworks 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(); - 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 ); diff --git a/Facepunch.Steamworks/Classes/ConnectionInterface.cs b/Facepunch.Steamworks/Classes/ConnectionInterface.cs index c6cdb73..a4ce365 100644 --- a/Facepunch.Steamworks/Classes/ConnectionInterface.cs +++ b/Facepunch.Steamworks/Classes/ConnectionInterface.cs @@ -1,7 +1,6 @@ -using System; -using System.Collections.Generic; -using System.IO; -using Steamworks.Data; +using Steamworks.Data; +using System; +using System.Runtime.InteropServices; namespace Steamworks { @@ -67,37 +66,52 @@ namespace Steamworks Connected = false; } - SteamNetworkingMessage_t[] messageBuffer; - - public void Receive() + public void Receive( int bufferSize = 32 ) { - if ( messageBuffer == null ) + // #32bit + int processed = 0; + IntPtr messageBuffer = Marshal.AllocHGlobal( 8 * bufferSize ); + + try { - messageBuffer = new SteamNetworkingMessage_t[128]; + processed = SteamNetworkingSockets.Internal.ReceiveMessagesOnConnection( Connection, messageBuffer, bufferSize ); + + for ( int i = 0; i < processed; i++ ) + { + ReceiveMessage( Marshal.ReadIntPtr( messageBuffer, i ) ); + } } - - var processed = SteamNetworkingSockets.Internal.ReceiveMessagesOnConnection( Connection, ref messageBuffer, messageBuffer.Length ); - - for ( int i=0; i< processed; i++ ) + finally { - Console.WriteLine( "FOUND SOME!" ); - ReceiveMessage( messageBuffer[i] ); + Marshal.FreeHGlobal( messageBuffer ); } // // Overwhelmed our buffer, keep going // - if ( processed == messageBuffer.Length ) - Receive(); + if ( processed == bufferSize ) + 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( 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 ); } } } \ No newline at end of file