diff --git a/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj b/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj
index eb58d24..78cd6ce 100644
--- a/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj
+++ b/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj
@@ -30,6 +30,7 @@
prompt
4
x64
+ true
pdbonly
@@ -39,6 +40,7 @@
prompt
4
x64
+ true
true
@@ -48,6 +50,7 @@
x64
prompt
MinimumRecommendedRules.ruleset
+ true
bin\x64\Release\
@@ -57,6 +60,7 @@
x64
prompt
MinimumRecommendedRules.ruleset
+ true
true
@@ -66,6 +70,7 @@
x64
prompt
MinimumRecommendedRules.ruleset
+ true
bin\x86\Release\
@@ -75,6 +80,7 @@
x64
prompt
MinimumRecommendedRules.ruleset
+ true
diff --git a/Facepunch.Steamworks.Test/NetworkingSockets.cs b/Facepunch.Steamworks.Test/NetworkingSockets.cs
index 9006a3e..fe1ca64 100644
--- a/Facepunch.Steamworks.Test/NetworkingSockets.cs
+++ b/Facepunch.Steamworks.Test/NetworkingSockets.cs
@@ -96,10 +96,19 @@ namespace Steamworks
Console.WriteLine( "[Connection] Hey We're Connected!" );
+ var sw = System.Diagnostics.Stopwatch.StartNew();
+
+
while ( Connected )
{
Receive();
- await Task.Delay( 10 );
+ await Task.Delay( 100 );
+
+ if ( sw.Elapsed.TotalSeconds > 5 )
+ {
+ Console.WriteLine( "CLIENT ERROR!!!!! TIMED OUT" );
+ break;
+ }
}
}
@@ -110,9 +119,26 @@ namespace Steamworks
Console.WriteLine( $"[Connection][{messageNum}][{recvTime}][{channel}] \"{str}\"" );
- if ( str.StartsWith( "Hello" ) )
+ if ( str.Contains( "Hello" ) )
{
Connection.SendMessage( "Hello, How are you!?" );
+
+ Connection.SendMessage( "How do you like 20 messages in a row?" );
+
+ for ( int i=0; i<20; i++ )
+ {
+ Connection.SendMessage( $"BLAMMO!" );
+ }
+ }
+
+ if ( str.Contains( "how about yourself" ) )
+ {
+ Connection.SendMessage( "I'm great, but I have to go now, bye." );
+ }
+
+ if ( str.Contains( "hater" ) )
+ {
+ Close();
}
}
@@ -173,14 +199,43 @@ namespace Steamworks
await Task.Delay( 300 );
singleClient.SendMessage( "Hello Client!?" );
- await Task.Delay( 1000 );
+ var sw = System.Diagnostics.Stopwatch.StartNew();
- singleClient.Close();
+ while ( Connected.Contains( singleClient ) )
+ {
+ Receive();
+ await Task.Delay( 100 );
+
+ if ( sw.Elapsed.TotalSeconds > 5 )
+ {
+ Assert.Fail( "Took too long" );
+ break;
+ }
+ }
await Task.Delay( 1000 );
Close();
}
+
+ public override unsafe void OnMessage( NetConnection connection, NetworkIdentity identity, 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( $"[SOCKET][{connection}[{identity}][{messageNum}][{recvTime}][{channel}] \"{str}\"" );
+
+ if ( str.Contains( "Hello, How are you" ) )
+ {
+ connection.SendMessage( "I'm great thanks, how about yourself?" );
+ }
+
+ if ( str.Contains( "bye" ) )
+ {
+ connection.SendMessage( "See you later, hater." );
+ connection.Close( true, 10, "Said Bye" );
+ }
+ }
}
}
diff --git a/Facepunch.Steamworks/Classes/ConnectionInterface.cs b/Facepunch.Steamworks/Classes/ConnectionInterface.cs
index a4ce365..1110682 100644
--- a/Facepunch.Steamworks/Classes/ConnectionInterface.cs
+++ b/Facepunch.Steamworks/Classes/ConnectionInterface.cs
@@ -37,6 +37,7 @@ namespace Steamworks
break;
case ConnectionState.ClosedByPeer:
case ConnectionState.ProblemDetectedLocally:
+ case ConnectionState.None:
OnDisconnected( data );
break;
}
@@ -78,7 +79,8 @@ namespace Steamworks
for ( int i = 0; i < processed; i++ )
{
- ReceiveMessage( Marshal.ReadIntPtr( messageBuffer, i ) );
+ // #32bit
+ ReceiveMessage( Marshal.ReadIntPtr( messageBuffer, i * 8) );
}
}
finally
diff --git a/Facepunch.Steamworks/Classes/SocketInterface.cs b/Facepunch.Steamworks/Classes/SocketInterface.cs
index 48331a1..b14474a 100644
--- a/Facepunch.Steamworks/Classes/SocketInterface.cs
+++ b/Facepunch.Steamworks/Classes/SocketInterface.cs
@@ -1,4 +1,6 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
using Steamworks.Data;
namespace Steamworks
@@ -25,6 +27,7 @@ namespace Steamworks
break;
case ConnectionState.ClosedByPeer:
case ConnectionState.ProblemDetectedLocally:
+ case ConnectionState.None:
OnDisconnected( connection, data );
break;
}
@@ -58,5 +61,54 @@ namespace Steamworks
Connecting.Remove( connection );
Connected.Remove( connection );
}
+
+ public void Receive( int bufferSize = 32 )
+ {
+ // #32bit
+ int processed = 0;
+ IntPtr messageBuffer = Marshal.AllocHGlobal( 8 * bufferSize );
+
+ try
+ {
+ processed = SteamNetworkingSockets.Internal.ReceiveMessagesOnListenSocket( Socket, messageBuffer, bufferSize );
+
+ for ( int i = 0; i < processed; i++ )
+ {
+ // #32bit
+ ReceiveMessage( Marshal.ReadIntPtr( messageBuffer, i * 8 ) );
+ }
+ }
+ finally
+ {
+ Marshal.FreeHGlobal( messageBuffer );
+ }
+
+ //
+ // Overwhelmed our buffer, keep going
+ //
+ if ( processed == bufferSize )
+ Receive( bufferSize );
+ }
+
+ internal unsafe void ReceiveMessage( IntPtr msgPtr )
+ {
+ var msg = Marshal.PtrToStructure( msgPtr );
+ try
+ {
+ OnMessage( msg.Connection, msg.Identity, msg.DataPtr, msg.DataSize, msg.TimeRecv, msg.MessageNumber, msg.Channel );
+ }
+ finally
+ {
+ //
+ // Releases the message
+ //
+ msg.Release( msgPtr );
+ }
+ }
+
+ public virtual void OnMessage( NetConnection connection, NetworkIdentity identity, IntPtr data, int size, long messageNum, SteamNetworkingMicroseconds recvTime, int channel )
+ {
+
+ }
}
}
\ No newline at end of file