NAME
ACE_Connector -
Generic factory for actively connecting clients and creating
service handlers (SVC_HANDLERs).
SYNOPSIS
#include <ace/Connector.h>
template<class SVC_HANDLER, ACE_PEER_CONNECTOR_1>
class ACE_Connector : public ACE_Service_Object
{
public:
ACE_Connector (ACE_Reactor *r = ACE_Service_Config::reactor ());
virtual int open (
ACE_Reactor *r = ACE_Service_Config::reactor ()
);
~ACE_Connector (void);
virtual int connect (
SVC_HANDLER *svc_handler,
const ACE_PEER_CONNECTOR_ADDR &remote_addr,
const ACE_Synch_Options &synch_options = ACE_Synch_Options::defaults,
const ACE_PEER_CONNECTOR_ADDR &local_addr = (ACE_PEER_CONNECTOR_ADDR &) ACE_PEER_CONNECTOR_ADDR::sap_any,
int reuse_addr = 0,
int flags = O_RDWR,
int perms = 0
);
virtual int cancel (SVC_HANDLER *svc_handler);
ACE_PEER_CONNECTOR &connector (void) const;
ACE_Reactor *reactor (void) const;
void reactor (ACE_Reactor *);
void dump (void) const;
ACE_ALLOC_HOOK_DECLARE;
protected:
typedef ACE_Svc_Tuple<SVC_HANDLER> AST;
typedef ACE_Map_Manager<ACE_HANDLE, ACE_Svc_Tuple<SVC_HANDLER> *, ACE_RW_Mutex> MAP_MANAGER;
typedef ACE_Map_Iterator<ACE_HANDLE, ACE_Svc_Tuple<SVC_HANDLER> *, ACE_RW_Mutex> MAP_ITERATOR;
typedef ACE_Map_Entry<ACE_HANDLE, ACE_Svc_Tuple<SVC_HANDLER> *> MAP_ENTRY;
typedef ACE_Map_Manager<ACE_HANDLE, ACE_Svc_Tuple<SVC_HANDLER> *, ACE_Null_Mutex> MAP_MANAGER;
typedef ACE_Map_Iterator<ACE_HANDLE, ACE_Svc_Tuple<SVC_HANDLER> *, ACE_Null_Mutex> MAP_ITERATOR;
typedef ACE_Map_Entry<ACE_HANDLE, ACE_Svc_Tuple<SVC_HANDLER> *> MAP_ENTRY;
virtual int connect_svc_handler (
SVC_HANDLER *svc_handler,
const ACE_PEER_CONNECTOR_ADDR &remote_addr,
const ACE_Synch_Options &synch_options,
const ACE_PEER_CONNECTOR_ADDR &local_addr,
int reuse_addr,
int flags,
int perms
);
virtual int activate_svc_handler (SVC_HANDLER *svc_handler);
virtual int handle_input (ACE_HANDLE);
virtual int handle_output (ACE_HANDLE);
virtual int init (int argc, char *argv[]);
virtual int fini (void);
virtual int info (char **, size_t) const;
virtual int handle_close (
ACE_HANDLE = ACE_INVALID_HANDLE,
ACE_Reactor_Mask = ACE_Event_Handler::RWE_MASK
);
virtual ACE_HANDLE get_handle (void) const;
virtual int handle_timeout (
const ACE_Time_Value &tv,
const void *arg
);
virtual int suspend (void);
virtual int resume (void);
int create_AST (SVC_HANDLER *, const ACE_Synch_Options &);
int cleanup_AST (ACE_HANDLE, AST *&);
MAP_MANAGER handler_map_;
private:
ACE_PEER_CONNECTOR connector_;
ACE_Reactor *reactor_;
};
DESCRIPTION
Implements the strategy for actively establishing connections
with clients. An ACE_Connector is parameterized by concrete
types that conform to the interfaces of PEER_CONNECTOR and
SVC_HANDLER. The PEER_CONNECTOR is instantiated with a
transport mechanism that passively establishes connections.
The SVC_HANDLER is instantiated with a concrete type that
performs the application-specific service. An ACE_Connector
inherits from ACE_Service_Object, which in turn inherits from
ACE_Event_Handler. This enables the ACE_Reactor to dispatch
the ACE_Connector's handle_output method when connections
complete asynchronously. The handle_output method performs
the connector's active connection establishment and service
activation strategy.
Initialization and termination methods.
ACE_Connector (ACE_Reactor *r = ACE_Service_Config::reactor ());
virtual int open (ACE_Reactor *r = ACE_Service_Config::reactor ());
~ACE_Connector (void);
Shutdown a connector and release resources.
Connection establishment method
virtual int connect (
SVC_HANDLER *svc_handler,
const ACE_PEER_CONNECTOR_ADDR &remote_addr,
const ACE_Synch_Options &synch_options = ACE_Synch_Options::defaults,
const ACE_PEER_CONNECTOR_ADDR &local_addr = (ACE_PEER_CONNECTOR_ADDR &) ACE_PEER_CONNECTOR_ADDR::sap_any,
int reuse_addr = 0,
int flags = O_RDWR,
int perms = 0
);
Initiate connection to peer at remote_addr using
synch_options. If the caller wants to designate the selected
local_addr they can (and can also insist that the local_addr
be reused by passing a value reuse_addr == 1). flags and
perms can be used to pass any flags that are needed to perform
specific operations such as opening a file within connect with
certain permissions.
virtual int cancel (SVC_HANDLER *svc_handler);
Cancel a svc_handler that was started asynchronously.
ACE_PEER_CONNECTOR &connector (void) const;
Return the underlying PEER_CONNECTOR object.
ACE_Reactor *reactor (void) const;
Get the underlying Reactor *.
void reactor (ACE_Reactor *);
Set the underlying Reactor *.
void dump (void) const;
Dump the state of an object.
ACE_ALLOC_HOOK_DECLARE;
Declare the dynamic allocation hooks.
Helpful typedefs.
typedef ACE_Svc_Tuple<SVC_HANDLER> AST;
typedef ACE_Map_Manager<ACE_HANDLE, ACE_Svc_Tuple<SVC_HANDLER> *, ACE_RW_Mutex> MAP_MANAGER;
typedef ACE_Map_Iterator<ACE_HANDLE, ACE_Svc_Tuple<SVC_HANDLER> *, ACE_RW_Mutex> MAP_ITERATOR;
typedef ACE_Map_Entry<ACE_HANDLE, ACE_Svc_Tuple<SVC_HANDLER> *> MAP_ENTRY;
typedef ACE_Map_Manager<ACE_HANDLE, ACE_Svc_Tuple<SVC_HANDLER> *, ACE_Null_Mutex> MAP_MANAGER;
typedef ACE_Map_Iterator<ACE_HANDLE, ACE_Svc_Tuple<SVC_HANDLER> *, ACE_Null_Mutex> MAP_ITERATOR;
typedef ACE_Map_Entry<ACE_HANDLE, ACE_Svc_Tuple<SVC_HANDLER> *> MAP_ENTRY;
The following two methods define the Connector's strategies for
connecting and activating SVC_HANDLER's, respectively.
virtual int connect_svc_handler (
SVC_HANDLER *svc_handler,
const ACE_PEER_CONNECTOR_ADDR &remote_addr,
const ACE_Synch_Options &synch_options,
const ACE_PEER_CONNECTOR_ADDR &local_addr,
int reuse_addr,
int flags,
int perms
);
Bridge method for connecting the svc_handler to the
remote_addr. The default behavior delegates to the
PEER_CONNECTOR::connect.
virtual int activate_svc_handler (SVC_HANDLER *svc_handler);
Bridge method for activating a svc_handler with the appropriate
concurrency strategy. The default behavior of this method is to
activate the SVC_HANDLER by calling its open() method (which
allows the SVC_HANDLER to define its own concurrency strategy).
However, subclasses can override this strategy to do more
sophisticated concurrency activations (such as creating the
SVC_HANDLER as an "active object" via multi-threading or
multi-processing).
virtual int handle_input (ACE_HANDLE);
Called by ACE_Reactor when asynchronous connections fail.
virtual int handle_output (ACE_HANDLE);
Called by ACE_Reactor when asynchronous connections succeed.
Dynamic linking hooks.
virtual int init (int argc, char *argv[]);
Default version does no work and returns -1. Must be overloaded
by application developer to do anything meaningful.
virtual int fini (void);
Calls handle_close to shutdown the Connector gracefully.
virtual int info (char **, size_t) const;
Default version returns address info in buf.
Demultiplexing hooks.
virtual int handle_close (
ACE_HANDLE = ACE_INVALID_HANDLE,
ACE_Reactor_Mask = ACE_Event_Handler::RWE_MASK
);
Terminate the Client ACE_Connector by iterating over any
unconnected ACE_Svc_Handler's and removing them from the
ACE_Reactor.
virtual ACE_HANDLE get_handle (void) const;
Return the underlying handle that's associated with the
SVC_HANDLER we're currently trying to connect (or
ACE_INVALID_HANDLER if there isn't one).
virtual int handle_timeout (
const ACE_Time_Value &tv,
const void *arg
);
This method is called if a connection times out before
completing.
Service management hooks.
virtual int suspend (void);
Default version does no work and returns -1. Must be overloaded
by application developer to do anything meaningful.
virtual int resume (void);
Default version does no work and returns -1. Must be overloaded
by application developer to do anything meaningful.
int create_AST (SVC_HANDLER *, const ACE_Synch_Options &);
Creates and inserts an ACE_Svc_Tuple into the handler_map_.
so that we can continue accepting this connection asynchronously.
int cleanup_AST (ACE_HANDLE, AST *&);
Cleanup the handler_map_ and returns the appropriate
ACE_Svc_Tuple (which is 0 if there is no associated tuple).
MAP_MANAGER handler_map_;
Lookup table that maps an I/O handle to a SVC_HANDLER *.
AUTHOR
Doug Schmidt
LIBRARY
ace