SNode.C
Loading...
Searching...
No Matches
core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT > Class Template Referenceabstract

#include <SocketAcceptor.h>

Inheritance diagram for core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >:
Collaboration diagram for core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >:

Public Member Functions

 SocketAcceptor (const std::shared_ptr< core::socket::stream::SocketContextFactory > &socketContextFactory, const std::function< void(SocketConnection *)> &onConnect, const std::function< void(SocketConnection *)> &onConnected, const std::function< void(SocketConnection *)> &onDisconnect, const std::function< void(const SocketAddress &, core::socket::State)> &onStatus, const std::shared_ptr< Config > &config)
 
 SocketAcceptor (const SocketAcceptor &socketAcceptor)
 
 ~SocketAcceptor () override
 

Protected Types

using Config = ConfigT
 
using SocketAddress = typename PhysicalServerSocket::SocketAddress
 
using SocketConnection = SocketConnectionT< PhysicalServerSocket, Config >
 

Protected Member Functions

virtual void useNextSocketAddress ()=0
 
virtual void init ()
 
void destruct () final
 
- Protected Member Functions inherited from core::eventreceiver::AcceptEventReceiver
 AcceptEventReceiver (const std::string &name, const utils::Timeval &timeout)
 
virtual void acceptTimeout ()
 
- Protected Member Functions inherited from core::DescriptorEventReceiver
bool enable (int fd)
 
void disable ()
 
void suspend ()
 
void resume ()
 
 DescriptorEventReceiver (const std::string &name, DescriptorEventPublisher &descriptorEventPublisher, const utils::Timeval &timeout=TIMEOUT::DISABLE)
 
int getRegisteredFd () const
 
bool isEnabled () const
 
bool isSuspended () const
 
void setTimeout (const utils::Timeval &timeout)
 
utils::Timeval getTimeout (const utils::Timeval &currentTime) const
 
void checkTimeout (const utils::Timeval &currentTime)
 
- Protected Member Functions inherited from core::Observer
void observed ()
 
void unObserved ()
 
 Observer ()=default
 
 Observer (Observer &)=delete
 
 Observer (Observer &&)=delete
 
virtual ~Observer ()
 
- Protected Member Functions inherited from core::EventReceiver
virtual ~EventReceiver ()=default
 
 EventReceiver (const std::string &name)
 
 EventReceiver (EventReceiver &)=delete
 
 EventReceiver (EventReceiver &&)=delete
 
EventReceiveroperator= (EventReceiver &)=delete
 
EventReceiveroperator= (EventReceiver &&)=delete
 
void span ()
 
void relax ()
 
const std::string & getName () const
 

Protected Attributes

std::shared_ptr< core::socket::stream::SocketContextFactorysocketContextFactory = nullptr
 
std::function< void(SocketConnection *)> onConnect
 
std::function< void(SocketConnection *)> onConnected
 
std::function< void(SocketConnection *)> onDisconnect
 
std::function< void(const SocketAddress &, core::socket::State)> onStatus = nullptr
 
std::shared_ptr< Configconfig
 

Private Types

using PhysicalServerSocket = PhysicalSocketServerT
 

Private Member Functions

void acceptEvent () final
 
void unobservedEvent () final
 

Private Attributes

PhysicalServerSocket physicalServerSocket
 
SocketAddress bindAddress
 

Detailed Description

template<typename PhysicalSocketServerT, typename ConfigT, template< typename PhysicalSocketServer, typename Config > typename SocketConnectionT>
class core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >

Sequence diagram showing how a connect to a peer is performed.

Definition at line 69 of file SocketAcceptor.h.

Member Typedef Documentation

◆ Config

template<typename PhysicalSocketServerT , typename ConfigT , template< typename PhysicalSocketServer, typename Config > typename SocketConnectionT>
using core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::Config = ConfigT
protected

Definition at line 74 of file SocketAcceptor.h.

◆ PhysicalServerSocket

template<typename PhysicalSocketServerT , typename ConfigT , template< typename PhysicalSocketServer, typename Config > typename SocketConnectionT>
using core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::PhysicalServerSocket = PhysicalSocketServerT
private

Definition at line 71 of file SocketAcceptor.h.

◆ SocketAddress

template<typename PhysicalSocketServerT , typename ConfigT , template< typename PhysicalSocketServer, typename Config > typename SocketConnectionT>
using core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::SocketAddress = typename PhysicalServerSocket::SocketAddress
protected

Definition at line 75 of file SocketAcceptor.h.

◆ SocketConnection

template<typename PhysicalSocketServerT , typename ConfigT , template< typename PhysicalSocketServer, typename Config > typename SocketConnectionT>
using core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::SocketConnection = SocketConnectionT<PhysicalServerSocket, Config>
protected

Definition at line 76 of file SocketAcceptor.h.

Constructor & Destructor Documentation

◆ SocketAcceptor() [1/2]

template<typename PhysicalSocketServer , typename Config , template< typename ConfigT, typename PhysicalSocketServerT > typename SocketConnection>
core::socket::stream::SocketAcceptor< PhysicalSocketServer, Config, SocketConnection >::SocketAcceptor ( const std::shared_ptr< core::socket::stream::SocketContextFactory > &  socketContextFactory,
const std::function< void(SocketConnection *)> &  onConnect,
const std::function< void(SocketConnection *)> &  onConnected,
const std::function< void(SocketConnection *)> &  onDisconnect,
const std::function< void(const SocketAddress &, core::socket::State)> &  onStatus,
const std::shared_ptr< Config > &  config 
)

Definition at line 61 of file SocketAcceptor.hpp.

68 : core::eventreceiver::AcceptEventReceiver(config->getInstanceName() + " SocketAcceptor", 0)
74 , config(config) {
75 atNextTick([this]() {
77 init();
78 } else {
79 destruct();
80 }
81 });
82 }
static void atNextTick(const std::function< void(void)> &callBack)
std::function< void(SocketConnection *)> onConnected
std::function< void(SocketConnection *)> onConnect
std::function< void(SocketConnection *)> onDisconnect
std::shared_ptr< core::socket::stream::SocketContextFactory > socketContextFactory
std::shared_ptr< Config > config
std::function< void(const SocketAddress &, core::socket::State)> onStatus
State eventLoopState()
Definition State.cpp:52

References core::EventReceiver::atNextTick(), core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::config, core::eventLoopState(), core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::init(), core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::onConnect, core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::onConnected, core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::onDisconnect, core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::onStatus, core::RUNNING, and core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::socketContextFactory.

Here is the call graph for this function:

◆ SocketAcceptor() [2/2]

template<typename PhysicalSocketServer , typename Config , template< typename ConfigT, typename PhysicalSocketServerT > typename SocketConnection>
core::socket::stream::SocketAcceptor< PhysicalSocketServer, Config, SocketConnection >::SocketAcceptor ( const SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT > &  socketAcceptor)

Definition at line 87 of file SocketAcceptor.hpp.

88 : core::eventreceiver::AcceptEventReceiver(socketAcceptor.config->getInstanceName() + " SocketAcceptor", 0)
89 , socketContextFactory(socketAcceptor.socketContextFactory)
90 , onConnect(socketAcceptor.onConnect)
91 , onConnected(socketAcceptor.onConnected)
92 , onDisconnect(socketAcceptor.onDisconnect)
93 , onStatus(socketAcceptor.onStatus)
94 , config(socketAcceptor.config) {
95 atNextTick([this]() {
97 init();
98 } else {
99 destruct();
100 }
101 });
102 }

◆ ~SocketAcceptor()

template<typename PhysicalSocketServer , typename Config , template< typename ConfigT, typename PhysicalSocketServerT > typename SocketConnection>
core::socket::stream::SocketAcceptor< PhysicalSocketServer, Config, SocketConnection >::~SocketAcceptor ( )
override

Definition at line 107 of file SocketAcceptor.hpp.

107 {
108 }

Member Function Documentation

◆ acceptEvent()

template<typename PhysicalSocketServer , typename Config , template< typename ConfigT, typename PhysicalSocketServerT > typename SocketConnection>
void core::socket::stream::SocketAcceptor< PhysicalSocketServer, Config, SocketConnection >::acceptEvent ( )
finalprivatevirtual

Implements core::eventreceiver::AcceptEventReceiver.

Definition at line 216 of file SocketAcceptor.hpp.

216 {
217 int acceptsPerTick = config->getAcceptsPerTick();
218
219 do {
220 PhysicalServerSocket connectedPhysicalSocket(physicalServerSocket.accept4(PhysicalServerSocket::Flags::NONBLOCK), bindAddress);
221
222 if (connectedPhysicalSocket.isValid()) {
223 SocketConnection* socketConnection = new SocketConnection(std::move(connectedPhysicalSocket), onDisconnect, config);
224
225 LOG(DEBUG) << config->getInstanceName() << " accept " << bindAddress.toString() << ": success";
226 LOG(DEBUG) << " " << socketConnection->getRemoteAddress().toString() << " -> "
227 << socketConnection->getLocalAddress().toString();
228
229 onConnect(socketConnection);
230 onConnected(socketConnection);
231 } else if (errno != EINTR && errno != EAGAIN && errno != EWOULDBLOCK) {
232 PLOG(WARNING) << config->getInstanceName() << " accept " << bindAddress.toString();
233 }
234 } while (--acceptsPerTick > 0);
235 }
SocketConnectionT< PhysicalServerSocket, Config > SocketConnection
PhysicalSocketServerT PhysicalServerSocket
PhysicalServerSocket physicalServerSocket

References core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::bindAddress, core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::config, core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::onConnect, core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::onConnected, core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::onDisconnect, and core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::physicalServerSocket.

◆ destruct()

template<typename PhysicalSocketServer , typename Config , template< typename ConfigT, typename PhysicalSocketServerT > typename SocketConnection>
void core::socket::stream::SocketAcceptor< PhysicalSocketServer, Config, SocketConnection >::destruct ( )
finalprotectedvirtual

◆ init()

template<typename PhysicalSocketServer , typename Config , template< typename ConfigT, typename PhysicalSocketServerT > typename SocketConnection>
void core::socket::stream::SocketAcceptor< PhysicalSocketServer, Config, SocketConnection >::init ( )
protectedvirtual

Reimplemented in core::socket::stream::tls::SocketAcceptor< PhysicalSocketServerT, ConfigT >.

Definition at line 113 of file SocketAcceptor.hpp.

113 {
114 if (!config->getDisabled()) {
115 try {
116 core::socket::State state = core::socket::STATE_OK;
117
118 LOG(TRACE) << config->getInstanceName() << ": Starting";
119
120 bindAddress = config->Local::getSocketAddress();
121
122 if (physicalServerSocket.open(config->getSocketOptions(), PhysicalServerSocket::Flags::NONBLOCK) < 0) {
123 PLOG(ERROR) << config->getInstanceName() << " open " << bindAddress.toString();
124
125 switch (errno) {
126 case EMFILE:
127 case ENFILE:
128 case ENOBUFS:
129 case ENOMEM:
130 state = core::socket::STATE_ERROR;
131 break;
132 default:
133 state = core::socket::STATE_FATAL;
134 break;
135 }
136 } else {
137 LOG(DEBUG) << config->getInstanceName() << " open " << bindAddress.toString() << ": success";
138
139 if (physicalServerSocket.bind(bindAddress) < 0) {
140 PLOG(ERROR) << config->getInstanceName() << " bind " << bindAddress.toString();
141
142 switch (errno) {
143 case EADDRINUSE:
144
145 state = core::socket::STATE_ERROR;
146 break;
147 default:
148
149 state = core::socket::STATE_FATAL;
150 break;
151 }
152 } else {
153 LOG(DEBUG) << config->getInstanceName() << " bind " << bindAddress.toString() << ": success";
154
155 if (physicalServerSocket.listen(config->getBacklog()) < 0) {
156 PLOG(ERROR) << config->getInstanceName() << " listen " << bindAddress.toString();
157
158 switch (errno) {
159 case EADDRINUSE:
160 state = core::socket::STATE_ERROR;
161 break;
162 default:
163 state = core::socket::STATE_FATAL;
164 break;
165 }
166 } else {
167 LOG(DEBUG) << config->getInstanceName() << " listen " << bindAddress.toString() << ": success";
168
169 if (enable(physicalServerSocket.getFd())) {
170 LOG(DEBUG) << config->getInstanceName() << " enable " << bindAddress.toString() << ": success";
171 } else {
172 LOG(ERROR) << config->getInstanceName() << " enable " << bindAddress.toString()
173 << ": failed. No valid descriptor created";
174
175 state = core::socket::STATE(core::socket::STATE_FATAL, ECANCELED, "SocketAcceptor not enabled");
176 }
177 }
178 }
179 }
180
181 SocketAddress currentLocalAddress = bindAddress;
182 if (bindAddress.useNext()) {
183 onStatus(currentLocalAddress, (state | core::socket::State::NO_RETRY));
184
185 LOG(DEBUG) << config->getInstanceName()
186 << ": Using next SocketAddress: " << config->Local::getSocketAddress().toString();
187
189 } else {
190 onStatus(currentLocalAddress, state);
191 }
192 } catch (const typename SocketAddress::BadSocketAddress& badSocketAddress) {
193 core::socket::State state =
194 core::socket::STATE(badSocketAddress.getState(), badSocketAddress.getErrnum(), badSocketAddress.what());
195
196 LOG(ERROR) << state.what();
197
198 onStatus({}, state);
199 }
200 } else {
201 LOG(DEBUG) << config->getInstanceName() << ": disabled";
202
203 onStatus({}, core::socket::STATE_DISABLED);
204 }
205
206 if (isEnabled()) {
208 } else {
209 destruct();
210 }
211 }
void setTimeout(const utils::Timeval &timeout)
std::string what() const
Definition State.cpp:114
static constexpr int NO_RETRY
Definition State.h:59
typename PhysicalServerSocket::SocketAddress SocketAddress

References core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::bindAddress, core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::config, core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::destruct(), core::DescriptorEventReceiver::enable(), core::DescriptorEventReceiver::isEnabled(), core::socket::State::NO_RETRY, core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::onStatus, core::socket::State::operator|(), core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::physicalServerSocket, core::DescriptorEventReceiver::setTimeout(), core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::useNextSocketAddress(), and core::socket::State::what().

Referenced by core::socket::stream::SocketAcceptor< PhysicalServerSocketT, ConfigT, core::socket::stream::legacy::SocketConnection >::acceptEvent(), and core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::SocketAcceptor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ unobservedEvent()

template<typename PhysicalSocketServer , typename Config , template< typename ConfigT, typename PhysicalSocketServerT > typename SocketConnection>
void core::socket::stream::SocketAcceptor< PhysicalSocketServer, Config, SocketConnection >::unobservedEvent ( )
finalprivatevirtual

Implements core::Observer.

Definition at line 240 of file SocketAcceptor.hpp.

240 {
241 destruct();
242 }

References core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::destruct().

Here is the call graph for this function:

◆ useNextSocketAddress()

template<typename PhysicalSocketServerT , typename ConfigT , template< typename PhysicalSocketServer, typename Config > typename SocketConnectionT>
virtual void core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::useNextSocketAddress ( )
protectedpure virtual

Implemented in core::socket::stream::legacy::SocketAcceptor< PhysicalServerSocketT, ConfigT >, and core::socket::stream::tls::SocketAcceptor< PhysicalSocketServerT, ConfigT >.

Referenced by core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::init().

Here is the caller graph for this function:

Member Data Documentation

◆ bindAddress

template<typename PhysicalSocketServerT , typename ConfigT , template< typename PhysicalSocketServer, typename Config > typename SocketConnectionT>
SocketAddress core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::bindAddress
private

◆ config

◆ onConnect

◆ onConnected

◆ onDisconnect

◆ onStatus

template<typename PhysicalSocketServerT , typename ConfigT , template< typename PhysicalSocketServer, typename Config > typename SocketConnectionT>
std::function<void(const SocketAddress&, core::socket::State)> core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::onStatus = nullptr
protected

◆ physicalServerSocket

template<typename PhysicalSocketServerT , typename ConfigT , template< typename PhysicalSocketServer, typename Config > typename SocketConnectionT>
PhysicalServerSocket core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::physicalServerSocket
private

◆ socketContextFactory

template<typename PhysicalSocketServerT , typename ConfigT , template< typename PhysicalSocketServer, typename Config > typename SocketConnectionT>
std::shared_ptr<core::socket::stream::SocketContextFactory> core::socket::stream::SocketAcceptor< PhysicalSocketServerT, ConfigT, SocketConnectionT >::socketContextFactory = nullptr
protected

The documentation for this class was generated from the following files: