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 // No dynamic allocation vs. Stack overflow safety.
77 // I chose the former, because I think it's not common to multicast to more than 10k connections at once.
78 auto** messages = static_cast<SteamNetworkingMessage_t**>(
79 NALCHI_ALLOCA(connections_count * sizeof(SteamNetworkingMessage_t*)));
80
81 std::remove_const_t<decltype(connections_count)> i = 0;
82 for (const auto conn : connections)
83 {
84 // TODO: Pool message instead of allocating.
85 messages[i] = SteamNetworkingUtils()->AllocateMessage(0);
86
87 // Setup the message to send to `conn`.
88 payload.add_to_message(messages[i], logical_bytes_length);
89 messages[i]->m_conn = conn;
90 messages[i]->m_nFlags = send_flags;
91 messages[i]->m_idxLane = lane;
92 messages[i]->m_nUserData = user_data;
93
94 ++i;
95 }
96
97 // Send all messages.
98 sockets->SendMessages(static_cast<int>(connections_count), messages,
99 reinterpret_cast<int64*>(out_message_number_or_result.data()));
100 }
101
121 NALCHI_API static void multicast(ISteamNetworkingSockets* sockets, unsigned connections_count,
122 const HSteamNetConnection* connections, nalchi::shared_payload payload,
123 int logical_bytes_length, int send_flags,
124 std::int64_t* out_message_number_or_result, std::uint16_t lane = 0,
125 std::int64_t user_data = 0);
126};
127
128} // 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