mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-03-14 22:20:51 +00:00
util for send/receive
This commit is contained in:
parent
57acd00ac6
commit
9000774c00
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user