mirror of
https://github.com/Facepunch/Facepunch.Steamworks.git
synced 2025-04-16 14:22:27 +03:00
ConnectionInterface MessageReading
This commit is contained in:
parent
14d947c7ba
commit
f77332a41f
@ -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 );
|
||||||
|
|
||||||
|
@ -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 );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user