5#include <asio/io_context.hpp>
6#include <asio/ip/udp.hpp>
68 void start()
override;
70 void shutdown()
override;
72 [[nodiscard]]
bool is_initialized()
const override {
return m_initialized.load(); }
73 [[nodiscard]]
bool is_running()
const override {
return m_running.load(); }
76 [[nodiscard]] std::string
get_name()
const override {
return "UDP (Asio)"; }
77 [[nodiscard]] std::string
get_version()
const override {
return "1.0"; }
81 uint64_t open_endpoint(
const EndpointInfo& info)
override;
82 void close_endpoint(uint64_t endpoint_id)
override;
83 [[nodiscard]]
EndpointState get_endpoint_state(uint64_t endpoint_id)
const override;
84 [[nodiscard]] std::vector<EndpointInfo> get_endpoints()
const override;
88 bool send(uint64_t endpoint_id,
const uint8_t* data,
size_t size)
override;
89 bool send_to(uint64_t endpoint_id,
const uint8_t* data,
size_t size,
90 const std::string& address, uint16_t port)
override;
106 std::array<uint8_t, 65536> recv_buffer {};
108 uint16_t local_port {};
109 uint32_t ref_count {};
126 bool has_default_remote {};
132 std::atomic<bool> m_initialized {
false };
133 std::atomic<bool> m_running {
false };
139 std::unordered_map<uint16_t, std::unique_ptr<SocketState>>
m_sockets;
156 void release_socket(uint16_t local_port);
169 void on_receive(
SocketState& state,
const asio::error_code& ec,
size_t bytes_received);
178 uint64_t resolve_endpoint_for_sender(
179 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.