Library: Net
Package: Reactor
Header: Poco/Net/SocketAcceptor.h
This class implements the Acceptor part of the Acceptor-Connector design pattern.
The Acceptor-Connector pattern has been described in the book "Pattern Languages of Program Design 3", edited by Robert Martin, Frank Buschmann and Dirk Riehle (Addison Wesley, 1997).
The Acceptor-Connector design pattern decouples connection establishment and service initialization in a distributed system from the processing performed once a service is initialized. This decoupling is achieved with three components: Acceptors, Connectors and Service Handlers. The SocketAcceptor passively waits for connection requests (usually from a remote Connector) and establishes a connection upon arrival of a connection requests. Also, a Service Handler is initialized to process the data arriving via the connection in an application-specific way.
The SocketAcceptor sets up a ServerSocket and registers itself for a ReadableNotification, denoting an incoming connection request.
When the ServerSocket becomes readable the SocketAcceptor accepts the connection request and creates a ServiceHandler to service the connection.
The ServiceHandler class must provide a constructor that takes a StreamSocket and a SocketReactor as arguments, e.g.:
MyServiceHandler(const StreamSocket& socket, ServiceReactor& reactor)
When the ServiceHandler is done, it must destroy itself.
Subclasses can override the createServiceHandler() factory method if special steps are necessary to create a ServiceHandler object.
Member Functions: createServiceHandler, onAccept, reactor, registerAcceptor, socket, unregisterAcceptor
explicit SocketAcceptor(
ServerSocket & socket
);
Creates an SocketAcceptor, using the given ServerSocket.
SocketAcceptor(
ServerSocket & socket,
SocketReactor & reactor
);
Creates an SocketAcceptor, using the given ServerSocket. The SocketAcceptor registers itself with the given SocketReactor.
virtual ~SocketAcceptor();
Destroys the SocketAcceptor.
void onAccept(
ReadableNotification * pNotification
);
virtual void registerAcceptor(
SocketReactor & reactor
);
Registers the SocketAcceptor with a SocketReactor.
A subclass can override this and, for example, also register an event handler for a timeout event.
The overriding method must call the baseclass implementation first.
virtual void unregisterAcceptor();
Unregisters the SocketAcceptor.
A subclass can override this and, for example, also unregister its event handler for a timeout event.
The overriding method must call the baseclass implementation first.
virtual ServiceHandler * createServiceHandler(
StreamSocket & socket
);
Create and initialize a new ServiceHandler instance.
Subclasses can override this method.
SocketReactor * reactor();
Returns a pointer to the SocketReactor where this SocketAcceptor is registered.
The pointer may be null.
Socket & socket();
Returns a reference to the SocketAcceptor's socket.