#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_;
};
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
);
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);
svc_handler
that was started asynchronously.
ACE_PEER_CONNECTOR &connector (void) const;
ACE_Reactor *reactor (void) const;
void reactor (ACE_Reactor *);
void dump (void) const;
ACE_ALLOC_HOOK_DECLARE;
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
);
svc_handler
to the
remote_addr
. The default behavior delegates to the
PEER_CONNECTOR::connect.
virtual int activate_svc_handler (SVC_HANDLER *svc_handler);
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);
virtual int handle_output (ACE_HANDLE);
virtual int init (int argc, char *argv[]);
virtual int fini (void);
handle_close
to shutdown the Connector gracefully.
virtual int info (char **, size_t) const;
buf
.
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 &);
handler_map_
.
so that we can continue accepting this connection asynchronously.
int cleanup_AST (ACE_HANDLE, AST *&);
handler_map_
and returns the appropriate
ACE_Svc_Tuple (which is 0 if there is no associated tuple).
MAP_MANAGER handler_map_;