4#ifndef _Stroika_Foundation_IO_Network_ConnectionlessSocket_h_
5#define _Stroika_Foundation_IO_Network_ConnectionlessSocket_h_ 1
7#include "Stroika/Foundation/StroikaPreComp.h"
22 namespace ConnectionlessSocket {
23 using namespace Socket;
45 bool operator== (
const PacketInfo&)
const =
default;
73 Ptr (
const Ptr& src) =
default;
75 Ptr (shared_ptr<_IRep>&& rep);
76 Ptr (
const shared_ptr<_IRep>& rep);
81 nonvirtual
Ptr& operator= (
const Ptr& rhs) =
default;
82 nonvirtual
Ptr& operator= (
Ptr&& rhs) =
default;
194 nonvirtual span<byte>
ReceiveFrom (span<byte> into,
int flag,
SocketAddress* fromAddress, optional<PacketInfo>* packetInfo,
200 nonvirtual shared_ptr<_IRep> _GetSharedRep ()
const;
206 nonvirtual _IRep&
_ref ()
const;
212 nonvirtual
const _IRep&
_cref ()
const;
215 [[deprecated (
"Since Stroika 3.0d15 use span{} overload")]]
size_t ReceiveFrom (
byte* intoStart,
byte* intoEnd,
int flag,
219 return ReceiveFrom (span{intoStart, intoEnd}, flag, fromAddress, timeout).size ();
221 [[deprecated (
"Since Stroika v3.0d15 use span overload")]]
void SendTo (
const byte* start,
const byte* end,
const SocketAddress& sockAddr)
const
223 SendTo (span<const byte>{start, end}, sockAddr);
229 class _IRep :
public Socket::_IRep {
231 virtual ~_IRep () =
default;
233 virtual void SendTo (
const byte* start,
const byte* end,
const SocketAddress& sockAddr) = 0;
234 virtual size_t ReceiveFrom (
byte* intoStart,
byte* intoEnd,
int flag,
SocketAddress* fromAddress,
236 virtual bool GetReceivePacketInfo ()
const = 0;
237 virtual void SetReceivePacketInfo (
bool on) = 0;
239 virtual void JoinMulticastGroup (
const InternetAddress& iaddr,
const variant<InternetAddress, unsigned int>& onInterface) = 0;
240 virtual void LeaveMulticastGroup (
const InternetAddress& iaddr,
const variant<InternetAddress, unsigned int>& onInterface) = 0;
241 virtual void SetMulticastInterface (
const variant<InternetAddress, unsigned int>& onInterface) = 0;
242 virtual uint8_t GetMulticastTTL ()
const = 0;
243 virtual void SetMulticastTTL (uint8_t ttl) = 0;
244 virtual bool GetMulticastLoopMode ()
const = 0;
245 virtual void SetMulticastLoopMode (
bool loopMode) = 0;
278namespace Stroika::Foundation::Execution::WaitForIOReady_Support {
281 template <
typename T>
282 struct WaitForIOReady_Traits;
284 struct WaitForIOReady_Traits<IO::Network::ConnectionlessSocket::Ptr> {
286 static inline auto GetSDKPollable (
const HighLevelType& t)
299#include "ConnectionlessSocket.inl"
chrono::duration< double > DurationSeconds
chrono::duration<double> - a time span (length of time) measured in seconds, but high precision.
String is like std::u32string, except it is much easier to use, often much more space efficient,...
nonvirtual void SendTo(span< const byte > data, const SocketAddress &sockAddr) const
nonvirtual void LeaveMulticastGroup(const InternetAddress &iaddr, const Interface &onInterface) const
nonvirtual void SetMulticastInterface(const Interface &i) const
nonvirtual void SetReceivePacketInfo(bool on) const
Have ReceiveFrom say where each datagram arrived (.
nonvirtual _IRep & _ref() const
nonvirtual bool GetReceivePacketInfo() const
Whether ReceiveFrom says where each datagram arrived (.
nonvirtual span< byte > ReceiveFrom(span< byte > into, int flag, SocketAddress *fromAddress, Time::DurationSeconds timeout=Time::kInfinity) const
nonvirtual void SetMulticastLoopMode(bool loopMode) const
nonvirtual void SetMulticastTTL(uint8_t ttl) const
nonvirtual const _IRep & _cref() const
nonvirtual uint8_t GetMulticastTTL() const
nonvirtual void JoinMulticastGroup(const InternetAddress &iaddr, const Interface &onInterface) const
nonvirtual bool GetMulticastLoopMode() const
a smart pointer wrapper (like shared_ptr <_IRep>).
nonvirtual PlatformNativeHandle GetNativeSocket() const
FamilyType
Socket address family - also sometimes referred to as domain (argument to ::socket calls it domain)
Ptr Attach(PlatformNativeHandle sd)
ConnectionlessSocket::Ptr New(SocketAddress::FamilyType family, Type socketKind, const optional< IPPROTO > &protocol=nullopt)
Where a datagram arrived (from ReceiveFrom, once SetReceivePacketInfo (true)): the interface it came ...
nonvirtual Characters::String ToString() const
unsigned int fInterfaceIndex
InternetAddress fDestination