Stroika Library 3.0d23x
 
Loading...
Searching...
No Matches
ConnectionOrientedMasterSocket.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2026. All rights reserved
3 */
4#include "Stroika/Foundation/StroikaPreComp.h"
5
8
9#include "Socket-Private_.h"
10
11#include "Stroika/Foundation/IO/Network/ConnectionOrientedMasterSocket.h"
12
13// Comment this in to turn on aggressive noisy DbgTrace in this module
14//#define USE_NOISY_TRACE_IN_THIS_MODULE_ 1
15
16using namespace Stroika::Foundation;
18using namespace Stroika::Foundation::Execution;
19using namespace Stroika::Foundation::Memory;
20using namespace Stroika::Foundation::IO;
22
23using namespace Stroika::Foundation::IO::Network::PRIVATE_;
24
25namespace {
26 struct Rep_ final : BackSocketImpl_<ConnectionOrientedMasterSocket::_IRep> {
27 using inherited = BackSocketImpl_<ConnectionOrientedMasterSocket::_IRep>;
29 : inherited{sd}
30 {
31 }
32 virtual void Listen (unsigned int backlog) override
33 {
34 Debug::TraceContextBumper ctx{"IO::Network::Socket::Listen", "backlog={}"_f, backlog};
35 AssertExternallySynchronizedMutex::WriteContext declareContext{fThisAssertExternallySynchronized};
36#if qStroika_Foundation_Common_Platform_POSIX
37 Handle_ErrNoResultInterruption ([this, &backlog] () -> int { return ::listen (fSD_, backlog); });
38#elif qStroika_Foundation_Common_Platform_Windows
39 ThrowWSASystemErrorIfSOCKET_ERROR (::listen (fSD_, backlog));
40#else
42#endif
43 }
44 virtual ConnectionOrientedStreamSocket::Ptr Accept () override
45 {
46 AssertExternallySynchronizedMutex::WriteContext declareContext{fThisAssertExternallySynchronized};
47 sockaddr_storage peer{};
48 socklen_t sz = sizeof (peer);
49#if qStroika_Foundation_Common_Platform_POSIX
50 return ConnectionOrientedStreamSocket::Attach (
51 Handle_ErrNoResultInterruption ([&] () -> int { return ::accept (fSD_, reinterpret_cast<sockaddr*> (&peer), &sz); }));
52#elif qStroika_Foundation_Common_Platform_Windows
53 return ConnectionOrientedStreamSocket::Attach (
54 ThrowWSASystemErrorIfSOCKET_ERROR (::accept (fSD_, reinterpret_cast<sockaddr*> (&peer), &sz)));
55#else
57#endif
58 }
59 };
60}
61
62/*
63 ********************************************************************************
64 ************************ ConnectionOrientedMasterSocket ************************
65 ********************************************************************************
66 */
68{
69 return Ptr{Memory::MakeSharedPtr<Rep_> (_Protected::mkLowLevelSocket_ (family, socketKind, protocol))};
70}
71
#define AssertNotImplemented()
Definition Assertions.h:401
unique_lock< AssertExternallySynchronizedMutex > WriteContext
Instantiate AssertExternallySynchronizedMutex::WriteContext to designate an area of code where protec...
FamilyType
Socket address family - also sometimes referred to as domain (argument to ::socket calls it domain)
auto Handle_ErrNoResultInterruption(CALL call) -> decltype(call())
Handle UNIX EINTR system call behavior - fairly transparently - just effectively removes them from th...
Ptr New(SocketAddress::FamilyType family, Type socketKind, const optional< IPPROTO > &protocol={})