Stroika Library 3.0d18
 
Loading...
Searching...
No Matches
ConnectionOrientedMasterSocket.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#include "Stroika/Foundation/StroikaPreComp.h"
5
7
8#include "Socket-Private_.h"
9
10#include "Stroika/Foundation/IO/Network/ConnectionOrientedMasterSocket.h"
11
12// Comment this in to turn on aggressive noisy DbgTrace in this module
13//#define USE_NOISY_TRACE_IN_THIS_MODULE_ 1
14
15using namespace Stroika::Foundation;
17using namespace Stroika::Foundation::Execution;
18using namespace Stroika::Foundation::Memory;
19using namespace Stroika::Foundation::IO;
21
22using namespace Stroika::Foundation::IO::Network::PRIVATE_;
23
24namespace {
25 struct Rep_ : BackSocketImpl_<ConnectionOrientedMasterSocket::_IRep> {
26 using inherited = BackSocketImpl_<ConnectionOrientedMasterSocket::_IRep>;
28 : inherited{sd}
29 {
30 }
31 virtual void Listen (unsigned int backlog) override
32 {
33 Debug::TraceContextBumper ctx{"IO::Network::Socket::Listen", "backlog={}"_f, backlog};
34 AssertExternallySynchronizedMutex::WriteContext declareContext{fThisAssertExternallySynchronized};
35#if qStroika_Foundation_Common_Platform_POSIX
36 Handle_ErrNoResultInterruption ([this, &backlog] () -> int { return ::listen (fSD_, backlog); });
37#elif qStroika_Foundation_Common_Platform_Windows
38 ThrowWSASystemErrorIfSOCKET_ERROR (::listen (fSD_, backlog));
39#else
41#endif
42 }
43 virtual ConnectionOrientedStreamSocket::Ptr Accept () override
44 {
45 AssertExternallySynchronizedMutex::WriteContext declareContext{fThisAssertExternallySynchronized};
46 sockaddr_storage peer{};
47 socklen_t sz = sizeof (peer);
48#if qStroika_Foundation_Common_Platform_POSIX
49 return ConnectionOrientedStreamSocket::Attach (
50 Handle_ErrNoResultInterruption ([&] () -> int { return ::accept (fSD_, reinterpret_cast<sockaddr*> (&peer), &sz); }));
51#elif qStroika_Foundation_Common_Platform_Windows
52 return ConnectionOrientedStreamSocket::Attach (
53 ThrowWSASystemErrorIfSOCKET_ERROR (::accept (fSD_, reinterpret_cast<sockaddr*> (&peer), &sz)));
54#else
56#endif
57 }
58 };
59}
60
61/*
62 ********************************************************************************
63 ************************ ConnectionOrientedMasterSocket ************************
64 ********************************************************************************
65 */
67{
68 return Ptr{make_shared<Rep_> (_Protected::mkLowLevelSocket_ (family, socketKind, protocol))};
69}
70
#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={})