5#if defined(_WIN32) || defined(_WIN64)
9#include <asio/io_context.hpp>
10#include <asio/ip/udp.hpp>
12#if defined(_WIN32) || defined(_WIN64)
78 void start()
override;
80 void shutdown()
override;
82 [[nodiscard]]
bool is_initialized()
const override {
return m_initialized.load(); }
83 [[nodiscard]]
bool is_running()
const override {
return m_running.load(); }
86 [[nodiscard]] std::string
get_name()
const override {
return "UDP (Asio)"; }
87 [[nodiscard]] std::string
get_version()
const override {
return "1.0"; }
91 uint64_t open_endpoint(
const EndpointInfo& info)
override;
92 void close_endpoint(uint64_t endpoint_id)
override;
93 [[nodiscard]]
EndpointState get_endpoint_state(uint64_t endpoint_id)
const override;
94 [[nodiscard]] std::vector<EndpointInfo> get_endpoints()
const override;
98 bool send(uint64_t endpoint_id,
const uint8_t* data,
size_t size)
override;
99 bool send_to(uint64_t endpoint_id,
const uint8_t* data,
size_t size,
100 const std::string& address, uint16_t port)
override;
116 std::array<uint8_t, 65536> recv_buffer {};
118 uint16_t local_port {};
119 uint32_t ref_count {};
136 bool has_default_remote {};
142 std::atomic<bool> m_initialized {
false };
143 std::atomic<bool> m_running {
false };
149 std::unordered_map<uint16_t, std::unique_ptr<SocketState>>
m_sockets;
166 void release_socket(uint16_t local_port);
179 void on_receive(
SocketState& state,
const asio::error_code& ec,
size_t bytes_received);
188 uint64_t resolve_endpoint_for_sender(
189 uint16_t local_port,
const asio::ip::udp::endpoint& sender)
const;
Abstract interface for network transport backends.
std::unordered_map< uint16_t, std::unique_ptr< SocketState > > m_sockets
NetworkReceiveCallback m_receive_callback
UDPBackend & operator=(const UDPBackend &)=delete
UDPBackend(UDPBackend &&)=delete
NetworkTransport get_transport() const override
bool is_initialized() const override
std::unordered_map< uint64_t, EndpointRecord > m_endpoints
std::string get_name() const override
UDPBackend(const UDPBackend &)=delete
EndpointStateCallback m_state_callback
bool is_running() const override
asio::io_context & m_context
UDPBackend & operator=(UDPBackend &&)=delete
std::shared_mutex m_sockets_mutex
std::string get_version() const override
std::shared_mutex m_endpoints_mutex
Connectionless datagram transport over UDP via standalone Asio.
EndpointState
Observable connection state for an endpoint.
NetworkTransport
Identifies the transport protocol a backend implements.
std::function< void(uint64_t endpoint_id, const uint8_t *data, size_t size, std::string_view sender_addr)> NetworkReceiveCallback
Callback signature for inbound data on an endpoint.
std::function< void(const EndpointInfo &info, EndpointState previous, EndpointState current)> EndpointStateCallback
Callback signature for endpoint state changes.
Describes one logical send/receive endpoint managed by a backend.
Configuration for the UDP transport backend.
asio::ip::udp::endpoint default_remote
SocketState(asio::io_context &ctx)
asio::ip::udp::endpoint sender_endpoint
asio::ip::udp::socket socket
Per-bound-port socket state.