util for send/receive

This commit is contained in:
JohnCorby 2025-02-26 14:55:43 -08:00
parent 57acd00ac6
commit 9000774c00
3 changed files with 23 additions and 23 deletions

View File

@ -1,7 +1,6 @@
using Mirror;
using Steamworks;
using System;
using System.Runtime.InteropServices;
namespace SteamTransport;
@ -90,9 +89,7 @@ public class Client
public void Send(ArraySegment<byte> segment, int channelId)
{
var handle = GCHandle.Alloc(segment.Array, GCHandleType.Pinned); // prevent moving or gc when passing to native function
var result = SteamNetworkingSockets.SendMessageToConnection(_conn, handle.AddrOfPinnedObject() + segment.Offset, (uint)segment.Count, Util.MirrorChannel2SendFlag(channelId), out _);
handle.Free();
var result = _conn.Send(segment, channelId);
if (result != EResult.k_EResultOK) _transport.Log($"[warn] send returned {result}");
_transport.OnClientDataSent?.Invoke(segment, channelId);
}
@ -103,13 +100,8 @@ public class Client
var numMessages = SteamNetworkingSockets.ReceiveMessagesOnConnection(_conn, ppOutMessages, ppOutMessages.Length);
for (var i = 0; i < numMessages; i++)
{
var ppOutMessage = ppOutMessages[i];
var msg = SteamNetworkingMessage_t.FromIntPtr(ppOutMessage);
var data = new byte[msg.m_cbSize];
Marshal.Copy(msg.m_pData, data, 0, msg.m_cbSize);
var channel = Util.SendFlag2MirrorChannel(msg.m_nFlags);
_transport.OnClientDataReceived?.Invoke(new ArraySegment<byte>(data), channel);
SteamNetworkingMessage_t.Release(ppOutMessage);
var (segment, channelId) = Util.Receive(ppOutMessages[i]);
_transport.OnClientDataReceived?.Invoke(segment, channelId);
}
}

View File

@ -2,7 +2,6 @@
using Steamworks;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace SteamTransport;
@ -85,9 +84,7 @@ public class Server
{
var conn = new HSteamNetConnection((uint)connectionId);
var handle = GCHandle.Alloc(segment.Array, GCHandleType.Pinned); // prevent moving or gc when passing to native function
var result = SteamNetworkingSockets.SendMessageToConnection(conn, handle.AddrOfPinnedObject() + segment.Offset, (uint)segment.Count, Util.MirrorChannel2SendFlag(channelId), out _);
handle.Free();
var result = conn.Send(segment, channelId);
if (result != EResult.k_EResultOK) _transport.Log($"[warn] send {conn.ToDebugString()} returned {result}");
_transport.OnServerDataSent?.Invoke(connectionId, segment, channelId);
}
@ -101,13 +98,8 @@ public class Server
var numMessages = SteamNetworkingSockets.ReceiveMessagesOnConnection(conn, ppOutMessages, ppOutMessages.Length);
for (var i = 0; i < numMessages; i++)
{
var ppOutMessage = ppOutMessages[i];
var msg = SteamNetworkingMessage_t.FromIntPtr(ppOutMessage);
var data = new byte[msg.m_cbSize];
Marshal.Copy(msg.m_pData, data, 0, msg.m_cbSize);
var channel = Util.SendFlag2MirrorChannel(msg.m_nFlags);
_transport.OnServerDataReceived?.Invoke((int)conn.m_HSteamNetConnection, new ArraySegment<byte>(data), channel);
SteamNetworkingMessage_t.Release(ppOutMessage);
var (segment, channelId) = Util.Receive(ppOutMessages[i]);
_transport.OnServerDataReceived?.Invoke((int)conn.m_HSteamNetConnection, segment, channelId);
}
}
}

View File

@ -42,7 +42,23 @@ public static class Util
return s;
}
// could do send/recv util, but i wanna inline for performance
public static EResult Send(this HSteamNetConnection conn, ArraySegment<byte> segment, int channelId)
{
var handle = GCHandle.Alloc(segment.Array, GCHandleType.Pinned); // prevent moving or gc when passing to native function
var result = SteamNetworkingSockets.SendMessageToConnection(conn, handle.AddrOfPinnedObject() + segment.Offset, (uint)segment.Count, MirrorChannel2SendFlag(channelId), out _);
handle.Free();
return result;
}
public static (ArraySegment<byte> segment, int channelId) Receive(IntPtr ppOutMessage)
{
var msg = SteamNetworkingMessage_t.FromIntPtr(ppOutMessage);
var segment = new ArraySegment<byte>(new byte[msg.m_cbSize]);
Marshal.Copy(msg.m_pData, segment.Array, 0, msg.m_cbSize);
var channel = SendFlag2MirrorChannel(msg.m_nFlags);
SteamNetworkingMessage_t.Release(ppOutMessage);
return (segment, channel);
}
public static SteamNetworkingConfigValue_t[] MakeOptions(SteamTransport transport)
{