4#ifndef _Stroika_Foundation_IO_Network_ConnectionOrientedStreamSocket_h_
5#define _Stroika_Foundation_IO_Network_ConnectionOrientedStreamSocket_h_ 1
7#include "Stroika/Foundation/StroikaPreComp.h"
13namespace Stroika::Foundation::Memory {
38 namespace ConnectionOrientedStreamSocket {
39 using namespace Socket;
45 struct KeepAliveOptions {
47#if qStroika_Foundation_Common_Platform_Linux or qStroika_Foundation_Common_Platform_Windows
48 optional<unsigned int> fMaxProbesSentBeforeDrop;
49 optional<Time::DurationSeconds> fTimeIdleBeforeSendingKeepalives;
50 optional<Time::DurationSeconds> fTimeBetweenIndividualKeepaliveProbes;
87 Ptr (
const Ptr& src) =
default;
89 Ptr (shared_ptr<_IRep>&& rep);
90 Ptr (
const shared_ptr<_IRep>& rep);
95 nonvirtual
Ptr& operator= (
const Ptr& rhs) =
default;
96 nonvirtual
Ptr& operator= (
Ptr&& rhs) =
default;
107 nonvirtual
void Close ()
const;
131 nonvirtual span<byte>
Read (span<byte> into)
const;
143 nonvirtual optional<span<byte>>
ReadNonBlocking (span<byte> into)
const;
155 nonvirtual
void Write (span<const byte> data)
const;
161 nonvirtual optional<IO::Network::SocketAddress>
GetPeerAddress ()
const;
195 nonvirtual optional<int>
GetLinger ()
const;
201 nonvirtual
void SetLinger (
const optional<int>& linger)
const;
216 nonvirtual
void SetKeepAlives (
const KeepAliveOptions& keepalive)
const;
229 nonvirtual
void SetTCPNoDelay (
bool noDelay)
const;
234 nonvirtual shared_ptr<_IRep> _GetSharedRep ()
const;
240 nonvirtual _IRep&
_ref ()
const;
246 nonvirtual
const _IRep&
_cref ()
const;
249 [[deprecated (
"Since Stroika v3.0d15 use span{} overload")]]
size_t Read (
byte* intoStart,
byte* intoEnd)
const
251 return Read (span{intoStart, intoEnd}).size ();
253 [[deprecated (
"Since Stroika v3.0d15 - use span overload")]]
void Write (
const byte* start,
const byte* end)
const
255 Write (span{start, end});
257 [[deprecated (
"Since Stroika v3.0d15 - use span overload")]] optional<size_t>
ReadNonBlocking (
byte* intoStart,
byte* intoEnd)
const
259 if (intoStart ==
nullptr) {
271 class _IRep :
public Socket::_IRep {
273 virtual ~_IRep () =
default;
275 virtual void Connect (
const SocketAddress& sockAddr,
const optional<Time::Duration>& timeout)
const = 0;
276 virtual span<byte> Read (span<byte> into)
const = 0;
277 virtual optional<span<byte>> ReadNonBlocking (span<byte> into)
const = 0;
278 virtual optional<size_t> AvailableToRead ()
const = 0;
279 virtual void Write (span<const byte> data)
const = 0;
280 virtual optional<IO::Network::SocketAddress> GetPeerAddress ()
const = 0;
281 virtual optional<Time::DurationSeconds> GetAutomaticTCPDisconnectOnClose ()
const = 0;
282 virtual void SetAutomaticTCPDisconnectOnClose (
const optional<Time::DurationSeconds>& waitFor) = 0;
283 virtual KeepAliveOptions GetKeepAlives ()
const = 0;
284 virtual void SetKeepAlives (
const KeepAliveOptions& keepAliveOptions) = 0;
285 virtual bool GetTCPNoDelay ()
const = 0;
286 virtual void SetTCPNoDelay (
bool noDelay) = 0;
335 const optional<IPPROTO>& protocol = {});
355 template <
typename T>
356 struct WaitForIOReady_Traits;
360 static inline auto GetSDKPollable (
const HighLevelType& t)
373#include "ConnectionOrientedStreamSocket.inl"
String is like std::u32string, except it is much easier to use, often much more space efficient,...
nonvirtual _IRep & _ref() const
nonvirtual optional< size_t > AvailableToRead() const
Non-blocking: return nullopt if no data available, 0 on known EOF, or number of bytes known available...
nonvirtual void SetAutomaticTCPDisconnectOnClose(const optional< Time::DurationSeconds > &waitFor) const
nonvirtual optional< IO::Network::SocketAddress > GetPeerAddress() const
nonvirtual void SetKeepAlives(const KeepAliveOptions &keepalive) const
nonvirtual span< byte > Read(span< byte > into) const
nonvirtual optional< Time::DurationSeconds > GetAutomaticTCPDisconnectOnClose() const
nonvirtual const _IRep & _cref() const
nonvirtual optional< span< byte > > ReadNonBlocking(span< byte > into) const
Non-blocking read: cross between AvailableToRead () and Read(): read as many bytes into 'into' bytes ...
nonvirtual void SetLinger(const optional< int > &linger) const
nonvirtual void Write(span< const byte > data) const
nonvirtual optional< int > GetLinger() const
nonvirtual KeepAliveOptions GetKeepAlives() const
Is this socket configured to use TCP keepalives (SO_KEEPALIVE)
nonvirtual bool GetTCPNoDelay() const
nonvirtual void Close() const
nonvirtual void Connect(const SocketAddress &sockAddr) const
Connects to the argument sockAddr;.
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)
Duration is a chrono::duration<double> (=.
Ptr NewConnection(const SocketAddress &sockAddr)
create a ConnectionOrientedStreamSocket::Ptr, and connect to the given address.
tuple< Ptr, Ptr > NewPair(SocketAddress::FamilyType family=SocketAddress::INET, Type socketKind=STREAM, const optional< IPPROTO > &protocol={})
Create a pair of sockets which talk locally, directly to one another (both endpoints on this machine)
Ptr Attach(PlatformNativeHandle sd)