nalchi
Loading...
Searching...
No Matches
socket_extensions.hpp
1#pragma once
2
3#include "nalchi/alloca.hpp"
4#include "nalchi/export.hpp"
5#include "nalchi/shared_payload.hpp"
6#include "nalchi/typed_input_range.hpp"
7
8#include <steam/isteamnetworkingsockets.h>
9#include <steam/isteamnetworkingutils.h>
10#include <steam/steamnetworkingtypes.h>
11
12#include <cstdint>
13#include <span>
14#include <type_traits>
15
16namespace nalchi
17{
18
21{
22public:
44 NALCHI_API static void unicast(ISteamNetworkingSockets* sockets, HSteamNetConnection connection,
45 nalchi::shared_payload payload, int logical_bytes_length, int send_flags,
46 std::int64_t* out_message_number_or_result, std::uint16_t lane = 0,
47 std::int64_t user_data = 0);
48
68 template <typed_input_range<HSteamNetConnection> ConnectionRange>
69 static void multicast(ISteamNetworkingSockets* sockets, ConnectionRange&& connections,
70 nalchi::shared_payload payload, int logical_bytes_length, int send_flags,
71 std::span<std::int64_t> out_message_number_or_result, std::uint16_t lane = 0,
72 std::int64_t user_data = 0)
73 {
74 const auto connections_count = std::ranges::size(connections);
75
76 // If no connections to send,
77 if (0 == connections_count)
78 {
79 // Force deallocate the payload, and return without sending.
81 return;
82 }
83
84 // No dynamic allocation vs. Stack overflow safety.
85 // I chose the former, because I think it's not common to multicast to more than 10k connections at once.
86 auto** messages = static_cast<SteamNetworkingMessage_t**>(
87 NALCHI_ALLOCA(connections_count * sizeof(SteamNetworkingMessage_t*)));
88
89 std::remove_const_t<decltype(connections_count)> i = 0;
90 for (const auto conn : connections)
91 {
92 // TODO: Pool message instead of allocating.
93 messages[i] = SteamNetworkingUtils()->AllocateMessage(0);
94
95 // Setup the message to send to `conn`.
96 payload.add_to_message(messages[i], logical_bytes_length);
97 messages[i]->m_conn = conn;
98 messages[i]->m_nFlags = send_flags;
99 messages[i]->m_idxLane = lane;
100 messages[i]->m_nUserData = user_data;
101
102 ++i;
103 }
104
105 // Send all messages.
106 sockets->SendMessages(static_cast<int>(connections_count), messages,
107 reinterpret_cast<int64*>(out_message_number_or_result.data()));
108 }
109
129 NALCHI_API static void multicast(ISteamNetworkingSockets* sockets, unsigned connections_count,
130 const HSteamNetConnection* connections, nalchi::shared_payload payload,
131 int logical_bytes_length, int send_flags,
132 std::int64_t* out_message_number_or_result, std::uint16_t lane = 0,
133 std::int64_t user_data = 0);
134};
135
136} // namespace nalchi
Extensions for ISteamNetworkingSockets.
Definition socket_extensions.hpp:21
static void multicast(ISteamNetworkingSockets *sockets, ConnectionRange &&connections, nalchi::shared_payload payload, int logical_bytes_length, int send_flags, std::span< std::int64_t > out_message_number_or_result, std::uint16_t lane=0, std::int64_t user_data=0)
Multicasts a shared_payload to the connections.
Definition socket_extensions.hpp:69
static void unicast(ISteamNetworkingSockets *sockets, HSteamNetConnection connection, nalchi::shared_payload payload, int logical_bytes_length, int send_flags, std::int64_t *out_message_number_or_result, std::uint16_t lane=0, std::int64_t user_data=0)
Unicasts a shared_payload to a connection.
static void multicast(ISteamNetworkingSockets *sockets, unsigned connections_count, const HSteamNetConnection *connections, nalchi::shared_payload payload, int logical_bytes_length, int send_flags, std::int64_t *out_message_number_or_result, std::uint16_t lane=0, std::int64_t user_data=0)
Multicasts a shared_payload to the connections.
Shared payload to store data to send.
Definition shared_payload.hpp:20
static void force_deallocate(shared_payload payload)
Force deallocates the shared payload without sending it.