From 639bd56a12249f1acbf285859f1c2867b1f7dbde Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Tue, 25 Feb 2025 02:06:57 -0800 Subject: [PATCH] not working for unknown reasons --- SteamTransport/Client.cs | 18 +++++++++++++++++- SteamTransport/Server.cs | 22 +++++++++++++++++++--- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/SteamTransport/Client.cs b/SteamTransport/Client.cs index 2b7186f7..0b404c1c 100644 --- a/SteamTransport/Client.cs +++ b/SteamTransport/Client.cs @@ -5,6 +5,7 @@ using System.Runtime.InteropServices; namespace SteamTransport; +// could check more Result stuff for functions. idc rn public class Client { private SteamTransport _transport; @@ -87,6 +88,20 @@ public class Client public void Send(ArraySegment segment, int channelId) { + // from fizzy + var data = new byte[segment.Count]; + Array.Copy(segment.Array, segment.Offset, data, 0, data.Length); + var pinnedArray = GCHandle.Alloc(data, GCHandleType.Pinned); + var pData = pinnedArray.AddrOfPinnedObject(); + + var result = SteamNetworkingSockets.SendMessageToConnection(_conn, pData, (uint)data.Length, Util.MirrorChannel2SendFlag(channelId), out _); + if (result == EResult.k_EResultOK) + _transport.OnClientDataSent?.Invoke(segment, channelId); + else + _transport.OnClientError?.Invoke(TransportError.InvalidSend, $"send returned {result}"); + // i dont think we have to check for disconnect result here since the status change handles that + + /* // use pointer to managed array instead of making copy. is this okay? unsafe { @@ -100,6 +115,7 @@ public class Client // i dont think we have to check for disconnect result here since the status change handles that } } + */ } public void Receive() @@ -111,7 +127,7 @@ public class Client var ppOutMessage = ppOutMessages[i]; var msg = SteamNetworkingMessage_t.FromIntPtr(ppOutMessage); var data = new byte[msg.m_cbSize]; - Marshal.Copy(msg.m_pData, data, 0, data.Length); + Marshal.Copy(msg.m_pData, data, 0, msg.m_cbSize); var channel = Util.SendFlag2MirrorChannel(msg.m_nFlags); _transport.OnClientDataReceived?.Invoke(new ArraySegment(data), channel); SteamNetworkingMessage_t.Release(ppOutMessage); diff --git a/SteamTransport/Server.cs b/SteamTransport/Server.cs index 457cae8d..dffd90f0 100644 --- a/SteamTransport/Server.cs +++ b/SteamTransport/Server.cs @@ -6,6 +6,7 @@ using System.Runtime.InteropServices; namespace SteamTransport; +// could check more Result stuff for functions. idc rn public class Server { private SteamTransport _transport; @@ -47,7 +48,7 @@ public class Server public bool IsListening; private HSteamListenSocket _listenSocket; - // mirror connection id is derived from uint to int cast here. seems to be okay for now + // mirror connection id is derived from uint to int cast here. seems to do unchecked cast and be fine private readonly List _conns = new(); public void StartListening() @@ -77,6 +78,20 @@ public class Server { var conn = new HSteamNetConnection((uint)connectionId); + // from fizzy + var data = new byte[segment.Count]; + Array.Copy(segment.Array, segment.Offset, data, 0, data.Length); + var pinnedArray = GCHandle.Alloc(data, GCHandleType.Pinned); + var pData = pinnedArray.AddrOfPinnedObject(); + + var result = SteamNetworkingSockets.SendMessageToConnection(conn, pData, (uint)data.Length, Util.MirrorChannel2SendFlag(channelId), out _); + if (result == EResult.k_EResultOK) + _transport.OnServerDataSent?.Invoke(connectionId, segment, channelId); + else + _transport.OnServerError?.Invoke(connectionId, TransportError.InvalidSend, $"send returned {result}"); + // i dont think we have to check for disconnect result here since the status change handles that + + /* // use pointer to managed array instead of making copy. is this okay? unsafe { @@ -90,6 +105,7 @@ public class Server // i dont think we have to check for disconnect result here since the status change handles that } } + */ } public void Receive() @@ -104,9 +120,9 @@ public class Server var ppOutMessage = ppOutMessages[i]; var msg = SteamNetworkingMessage_t.FromIntPtr(ppOutMessage); var data = new byte[msg.m_cbSize]; - Marshal.Copy(msg.m_pData, data, 0, data.Length); + Marshal.Copy(msg.m_pData, data, 0, msg.m_cbSize); var channel = Util.SendFlag2MirrorChannel(msg.m_nFlags); - _transport.OnServerDataReceived((int)conn.m_HSteamNetConnection, new ArraySegment(data), channel); + _transport.OnServerDataReceived?.Invoke((int)conn.m_HSteamNetConnection, new ArraySegment(data), channel); SteamNetworkingMessage_t.Release(ppOutMessage); } }