mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2025-10-08 20:17:18 +02:00
bin
module
vendor
CPR
ConcurrentQueue
Fmt
MaxmindDB
POCO
ApacheConnector
CppParser
CppUnit
Crypto
Data
Encodings
Foundation
JSON
JWT
MongoDB
Net
cmake
include
Poco
Net
AbstractHTTPRequestHandler.h
DNS.h
DatagramSocket.h
DatagramSocketImpl.h
DialogSocket.h
EscapeHTMLStream.h
FTPClientSession.h
FTPStreamFactory.h
FilePartSource.h
HTMLForm.h
HTTPAuthenticationParams.h
HTTPBasicCredentials.h
HTTPBasicStreamBuf.h
HTTPBufferAllocator.h
HTTPChunkedStream.h
HTTPClientSession.h
HTTPCookie.h
HTTPCredentials.h
HTTPDigestCredentials.h
HTTPFixedLengthStream.h
HTTPHeaderStream.h
HTTPIOStream.h
HTTPMessage.h
HTTPNTLMCredentials.h
HTTPRequest.h
HTTPRequestHandler.h
HTTPRequestHandlerFactory.h
HTTPResponse.h
HTTPServer.h
HTTPServerConnection.h
HTTPServerConnectionFactory.h
HTTPServerParams.h
HTTPServerRequest.h
HTTPServerRequestImpl.h
HTTPServerResponse.h
HTTPServerResponseImpl.h
HTTPServerSession.h
HTTPSession.h
HTTPSessionFactory.h
HTTPSessionInstantiator.h
HTTPStream.h
HTTPStreamFactory.h
HostEntry.h
ICMPClient.h
ICMPEventArgs.h
ICMPPacket.h
ICMPPacketImpl.h
ICMPSocket.h
ICMPSocketImpl.h
ICMPv4PacketImpl.h
IPAddress.h
IPAddressImpl.h
MailMessage.h
MailRecipient.h
MailStream.h
MediaType.h
MessageHeader.h
MultiSocketPoller.h
MulticastSocket.h
MultipartReader.h
MultipartWriter.h
NTLMCredentials.h
NTPClient.h
NTPEventArgs.h
NTPPacket.h
NameValueCollection.h
Net.h
NetException.h
NetworkInterface.h
NullPartHandler.h
OAuth10Credentials.h
OAuth20Credentials.h
POP3ClientSession.h
ParallelSocketAcceptor.h
ParallelSocketReactor.h
PartHandler.h
PartSource.h
PartStore.h
PollSet.h
QuotedPrintableDecoder.h
QuotedPrintableEncoder.h
RawSocket.h
RawSocketImpl.h
RemoteSyslogChannel.h
RemoteSyslogListener.h
SMTPChannel.h
SMTPClientSession.h
SSPINTLMCredentials.h
ServerSocket.h
ServerSocketImpl.h
SingleSocketPoller.h
Socket.h
SocketAcceptor.h
SocketAddress.h
SocketAddressImpl.h
SocketConnector.h
SocketDefs.h
SocketImpl.h
SocketNotification.h
SocketNotifier.h
SocketReactor.h
SocketStream.h
StreamSocket.h
StreamSocketImpl.h
StringPartSource.h
TCPServer.h
TCPServerConnection.h
TCPServerConnectionFactory.h
TCPServerDispatcher.h
TCPServerParams.h
UDPClient.h
UDPHandler.h
UDPServer.h
UDPServerParams.h
UDPSocketReader.h
WebSocket.h
WebSocketImpl.h
samples
src
testsuite
CMakeLists.txt
Makefile
Net.progen
Net_vs140.sln
Net_vs140.vcxproj
Net_vs140.vcxproj.filters
Net_vs150.sln
Net_vs150.vcxproj
Net_vs150.vcxproj.filters
Net_vs160.sln
Net_vs160.vcxproj
Net_vs160.vcxproj.filters
Net_vs90.sln
Net_vs90.vcproj
dependencies
NetSSL_OpenSSL
NetSSL_Win
PDF
PageCompiler
PocoDoc
ProGen
Redis
SevenZip
Util
XML
Zip
appveyor
build
cmake
contrib
doc
packaging
patches
release
travis
.gitattributes
.gitignore
.gitmodules
.travis.yml
CHANGELOG
CMakeLists.txt
CODE_OF_CONDUCT.md
CONTRIBUTING.md
CONTRIBUTORS
LICENSE
Makefile
NEWS
README
README.md
VERSION
appveyor.yml
build_cmake.cmd
build_cmake.sh
build_vs140.cmd
build_vs150.cmd
build_vs160.cmd
buildwin.cmd
buildwin.ps1
components
configure
cppignore.lnx
cppignore.win
env.bat
env.sh
libversion
SimpleIni
Squirrel
TinyDir
CMakeLists.txt
.gitignore
.gitmodules
CMakeLists.txt
LICENSE
README.md
Switched to POCO library for unified platform/library interface. Deprecated the external module API. It was creating more problems than solving. Removed most built-in libraries in favor of system libraries for easier maintenance. Cleaned and secured code with help from static analyzers.
192 lines
5.3 KiB
C++
192 lines
5.3 KiB
C++
//
|
|
// SocketAcceptor.h
|
|
//
|
|
// Library: Net
|
|
// Package: Reactor
|
|
// Module: SocketAcceptor
|
|
//
|
|
// Definition of the SocketAcceptor class.
|
|
//
|
|
// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
|
|
// and Contributors.
|
|
//
|
|
// SPDX-License-Identifier: BSL-1.0
|
|
//
|
|
|
|
|
|
#ifndef Net_SocketAcceptor_INCLUDED
|
|
#define Net_SocketAcceptor_INCLUDED
|
|
|
|
|
|
#include "Poco/Net/Net.h"
|
|
#include "Poco/Net/SocketNotification.h"
|
|
#include "Poco/Net/SocketReactor.h"
|
|
#include "Poco/Net/ServerSocket.h"
|
|
#include "Poco/Net/StreamSocket.h"
|
|
#include "Poco/Observer.h"
|
|
|
|
|
|
namespace Poco {
|
|
namespace Net {
|
|
|
|
|
|
template <class ServiceHandler>
|
|
class SocketAcceptor
|
|
/// 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.
|
|
{
|
|
public:
|
|
using Observer = Poco::Observer<SocketAcceptor, ReadableNotification>;
|
|
|
|
explicit SocketAcceptor(ServerSocket& socket):
|
|
_socket(socket),
|
|
_pReactor(0)
|
|
/// Creates a SocketAcceptor, using the given ServerSocket.
|
|
{
|
|
}
|
|
|
|
SocketAcceptor(ServerSocket& socket, SocketReactor& reactor):
|
|
_socket(socket),
|
|
_pReactor(&reactor)
|
|
/// Creates a SocketAcceptor, using the given ServerSocket.
|
|
/// The SocketAcceptor registers itself with the given SocketReactor.
|
|
{
|
|
_pReactor->addEventHandler(_socket, Observer(*this, &SocketAcceptor::onAccept));
|
|
}
|
|
|
|
virtual ~SocketAcceptor()
|
|
/// Destroys the SocketAcceptor.
|
|
{
|
|
try
|
|
{
|
|
if (_pReactor)
|
|
{
|
|
_pReactor->removeEventHandler(_socket, Observer(*this, &SocketAcceptor::onAccept));
|
|
}
|
|
}
|
|
catch (...)
|
|
{
|
|
poco_unexpected();
|
|
}
|
|
}
|
|
|
|
void setReactor(SocketReactor& reactor)
|
|
/// Sets the reactor for this acceptor.
|
|
{
|
|
registerAcceptor(reactor);
|
|
}
|
|
|
|
virtual void registerAcceptor(SocketReactor& reactor)
|
|
/// Registers the SocketAcceptor with a SocketReactor.
|
|
///
|
|
/// A subclass can override this function to e.g.
|
|
/// register an event handler for timeout event.
|
|
///
|
|
/// If acceptor was constructed without providing reactor to it,
|
|
/// the override of this method must either call the base class
|
|
/// implementation or directly register the accept handler with
|
|
/// the reactor.
|
|
{
|
|
_pReactor = &reactor;
|
|
if (!_pReactor->hasEventHandler(_socket, Observer(*this, &SocketAcceptor::onAccept)))
|
|
{
|
|
_pReactor->addEventHandler(_socket, Observer(*this, &SocketAcceptor::onAccept));
|
|
}
|
|
}
|
|
|
|
virtual void unregisterAcceptor()
|
|
/// Unregisters the SocketAcceptor.
|
|
///
|
|
/// A subclass can override this function to e.g.
|
|
/// unregister its event handler for a timeout event.
|
|
///
|
|
/// If the accept handler was registered with the reactor,
|
|
/// the overriding method must either call the base class
|
|
/// implementation or directly unregister the accept handler.
|
|
{
|
|
if (_pReactor)
|
|
{
|
|
_pReactor->removeEventHandler(_socket, Observer(*this, &SocketAcceptor::onAccept));
|
|
}
|
|
}
|
|
|
|
void onAccept(ReadableNotification* pNotification)
|
|
/// Accepts connection and creates event handler.
|
|
{
|
|
pNotification->release();
|
|
StreamSocket sock = _socket.acceptConnection();
|
|
_pReactor->wakeUp();
|
|
createServiceHandler(sock);
|
|
}
|
|
|
|
protected:
|
|
virtual ServiceHandler* createServiceHandler(StreamSocket& socket)
|
|
/// Create and initialize a new ServiceHandler instance.
|
|
///
|
|
/// Subclasses can override this method.
|
|
{
|
|
return new ServiceHandler(socket, *_pReactor);
|
|
}
|
|
|
|
SocketReactor* reactor()
|
|
/// Returns a pointer to the SocketReactor where
|
|
/// this SocketAcceptor is registered.
|
|
///
|
|
/// The pointer may be null.
|
|
{
|
|
return _pReactor;
|
|
}
|
|
|
|
Socket& socket()
|
|
/// Returns a reference to the SocketAcceptor's socket.
|
|
{
|
|
return _socket;
|
|
}
|
|
|
|
private:
|
|
SocketAcceptor();
|
|
SocketAcceptor(const SocketAcceptor&);
|
|
SocketAcceptor& operator = (const SocketAcceptor&);
|
|
|
|
ServerSocket _socket;
|
|
SocketReactor* _pReactor;
|
|
};
|
|
|
|
|
|
} } // namespace Poco::Net
|
|
|
|
|
|
#endif // Net_SocketAcceptor_INCLUDED
|