26#ifndef QB_IO_TRANSPORT_UDP_H_
27#define QB_IO_TRANSPORT_UDP_H_
32namespace qb::io::transport {
49 constexpr bool is_secure() const noexcept {
return false; }
74 : qb::io::endpoint(ep) {}
92 return std::hash<std::string_view>{}(
93 std::string_view(
reinterpret_cast<const char *
>(&
id),
id.len()));
104 return std::string_view(
reinterpret_cast<const char *
>(
this), len()) !=
105 std::string_view(
reinterpret_cast<const char *
>(&rhs), rhs.len());
137 template <
typename T>
140 auto &out_buffer =
static_cast<udp::base_t &
>(proxy).
out();
141 const auto start_size = out_buffer.size();
142 out_buffer << std::forward<T>(data);
143 auto p =
reinterpret_cast<udp::pushed_message *
>(out_buffer.begin() +
144 proxy._last_pushed_offset);
145 p->size += (out_buffer.size() - start_size);
155 return static_cast<udp::base_t &
>(proxy).
pendingWrite();
172 struct pushed_message {
178 int _last_pushed_offset = -1;
186 const udp::identity &
188 return _remote_source;
202 _last_pushed_offset = -1;
215 if (_last_pushed_offset < 0) {
216 _last_pushed_offset =
static_cast<int>(
_out_buffer.size());
217 auto &m =
_out_buffer.allocate_back<pushed_message>();
218 m.ident = _remote_dest;
263 auto &msg = *
reinterpret_cast<pushed_message *
>(
_out_buffer.begin());
264 auto begin =
_out_buffer.begin() +
sizeof(pushed_message) + msg.offset;
268 std::min(msg.size - msg.offset,
274 if (msg.offset == msg.size) {
275 _out_buffer.free_front(msg.size +
sizeof(pushed_message));
278 _last_pushed_offset = -1;
296 publish(
char const *data, std::size_t size)
noexcept {
311 auto &m =
_out_buffer.allocate_back<pushed_message>();
313 m.size =
static_cast<int>(size);
315 return static_cast<char *
>(
316 std::memcpy(
_out_buffer.allocate_back(size), data, size));
input_buffer_type _in_buffer
Buffer for incoming data.
Definition stream.h:59
_IO_ & transport() noexcept
Get the underlying transport object.
Definition stream.h:76
Combined input/output stream template class.
Definition stream.h:303
std::size_t pendingWrite() const noexcept
Definition stream.h:337
output_buffer_type _out_buffer
Definition stream.h:320
Proxy class providing a stream-like interface for sending UDP datagrams.
Definition udp.h:118
auto & operator<<(T &&data)
Stream output operator to append data to the current datagram being built.
Definition udp.h:139
std::size_t size()
Get the total size of data currently pending in the transport's output buffer for writing.
Definition udp.h:154
ProxyOut(udp &prx)
Constructor.
Definition udp.h:126
UDP transport providing connectionless, datagram-based communication.
Definition udp.h:44
int read() noexcept
Read a single datagram from the UDP socket.
Definition udp.h:236
char * publish(char const *data, std::size_t size) noexcept
Publish (enqueue) data to be sent to the current default destination (_remote_dest).
Definition udp.h:296
char * publish_to(udp::identity const &to, char const *data, std::size_t size) noexcept
Publish (enqueue) data to be sent to a specific udp::identity destination.
Definition udp.h:310
auto & out()
Get the output proxy (ProxyOut) for stream-like sending to the current destination.
Definition udp.h:214
constexpr bool is_secure() const noexcept
Indicates that this transport implementation is not secure.
Definition udp.h:49
void setDestination(udp::identity const &to) noexcept
Set the destination udp::identity for subsequent outgoing datagrams sent via out() or operator<<.
Definition udp.h:199
const udp::identity & getSource() const noexcept
Get the source udp::identity (endpoint) of the last successfully received datagram.
Definition udp.h:187
static constexpr const bool has_reset_on_pending_read
Indicates that this transport implementation resets its input buffer state when a read operation is p...
Definition udp.h:54
int write() noexcept
Write the next complete datagram from the output buffer to its destination.
Definition udp.h:259
static constexpr const std::size_t MaxDatagramSize
Maximum possible size of a UDP datagram.
Definition socket.h:62
Functional utilities, primarily for hash computations.
bool likely(bool expr)
Hint for branch prediction when a condition is expected to be true.
Definition branch_hints.h:49
Core stream abstraction classes for the QB IO library.
Hash function for udp::identity objects.
Definition udp.h:84
std::size_t operator()(const identity &id) const noexcept
Hash operator.
Definition udp.h:91
Identifies a UDP endpoint, extending qb::io::endpoint with hashing support.
Definition udp.h:65
identity(qb::io::endpoint const &ep)
Construct from an existing qb::io::endpoint.
Definition udp.h:73
identity()=default
Default constructor.
bool operator!=(identity const &rhs) const noexcept
Inequality operator.
Definition udp.h:103
Implementation of UDP sockets for datagram communication in the QB IO library.