ACE_TLI_Connector Class Reference

Defines an active connection factory for the ACE_TLI C++ wrappers. More...

#include <TLI_Connector.h>

Inheritance diagram for ACE_TLI_Connector:

Inheritance graph
[legend]
List of all members.

Public Types

typedef ACE_INET_Addr PEER_ADDR
typedef ACE_TLI_Stream PEER_STREAM

Public Member Functions

 ACE_TLI_Connector (void)
 Default constructor.

 ACE_TLI_Connector (ACE_TLI_Stream &new_stream, const ACE_Addr &remote_sap, ACE_Time_Value *timeout=0, const ACE_Addr &local_sap=ACE_Addr::sap_any, int reuse_addr=0, int flags=O_RDWR, int perms=0, const char device[]=ACE_TLI_TCP_DEVICE, struct t_info *info=0, int rw_flag=1, struct netbuf *udata=0, struct netbuf *opt=0)
int connect (ACE_TLI_Stream &new_stream, const ACE_Addr &remote_sap, ACE_Time_Value *timeout=0, const ACE_Addr &local_sap=ACE_Addr::sap_any, int reuse_addr=0, int flags=O_RDWR, int perms=0, const char device[]=ACE_TLI_TCP_DEVICE, struct t_info *info=0, int rw_flag=1, struct netbuf *udata=0, struct netbuf *opt=0)
int complete (ACE_TLI_Stream &new_stream, ACE_Addr *remote_sap, ACE_Time_Value *tv)
int reset_new_handle (ACE_HANDLE handle)
 Resets any event associations on this handle.

void dump (void) const
 Dump the state of an object.


Public Attributes

 ACE_ALLOC_HOOK_DECLARE
 Declare the dynamic allocation hooks.


Detailed Description

Defines an active connection factory for the ACE_TLI C++ wrappers.

Definition at line 35 of file TLI_Connector.h.


Member Typedef Documentation

typedef ACE_INET_Addr ACE_TLI_Connector::PEER_ADDR
 

Reimplemented in ACE_XTI_ATM_Mcast.

Definition at line 112 of file TLI_Connector.h.

typedef ACE_TLI_Stream ACE_TLI_Connector::PEER_STREAM
 

Reimplemented in ACE_XTI_ATM_Mcast.

Definition at line 113 of file TLI_Connector.h.


Constructor & Destructor Documentation

ACE_TLI_Connector::ACE_TLI_Connector void   ) 
 

Default constructor.

Definition at line 30 of file TLI_Connector.cpp.

References ACE_TRACE.

00031 {
00032   ACE_TRACE ("ACE_TLI_Connector::ACE_TLI_Connector");
00033 }

ACE_BEGIN_VERSIONED_NAMESPACE_DECL ACE_INLINE ACE_TLI_Connector::ACE_TLI_Connector ACE_TLI_Stream new_stream,
const ACE_Addr remote_sap,
ACE_Time_Value timeout = 0,
const ACE_Addr local_sap = ACE_Addr::sap_any,
int  reuse_addr = 0,
int  flags = O_RDWR,
int  perms = 0,
const char  device[] = ACE_TLI_TCP_DEVICE,
struct t_info *  info = 0,
int  rw_flag = 1,
struct netbuf *  udata = 0,
struct netbuf *  opt = 0
 

Actively connect and produce a if things go well. The is the address that we are trying to connect with. The is the amount of time to wait to connect. If it's 0 then we block indefinitely. If *timeout == {0, 0} then the connection is done using non-blocking mode. In this case, if the connection can't be made immediately the value of -1 is returned with <errno == EWOULDBLOCK>. If *timeout > {0, 0} then this is the maximum amount of time to wait before timing out. If the time expires before the connection is made <errno == ETIME>. The is the value of local address to bind to. If it's the default value of <ACE_Addr::sap_any> then the user is letting the OS do the binding. If == 1 then the is reused, even if it hasn't been cleanedup yet.

Definition at line 8 of file TLI_Connector.inl.

References ACE_ERROR, ACE_LIB_TEXT, ACE_TRACE, connect(), ETIME, EWOULDBLOCK, and LM_ERROR.

00020 {
00021   ACE_TRACE ("ACE_TLI_Connector::ACE_TLI_Connector");
00022   if (this->connect (new_stream,
00023                      remote_sap,
00024                      timeout,
00025                      local_sap,
00026                      reuse_addr,
00027                      flags,
00028                      perms,
00029                      device,
00030                      info,
00031                      rw_flag,
00032                      udata,
00033                      opt) == -1
00034       && timeout != 0 && !(errno == EWOULDBLOCK || errno == ETIME))
00035     ACE_ERROR ((LM_ERROR,
00036                 ACE_LIB_TEXT ("%p\n"),
00037                 ACE_LIB_TEXT ("ACE_TLI_Stream::ACE_TLI_Stream")));
00038 }


Member Function Documentation

int ACE_TLI_Connector::complete ACE_TLI_Stream new_stream,
ACE_Addr remote_sap,
ACE_Time_Value tv
 

Try to complete a non-blocking connection. If connection completion is successful then contains the connected ACE_SOCK_Stream. If is non-NULL then it will contain the address of the connected peer.

Definition at line 200 of file TLI_Connector.cpp.

References ACE_NONBLOCK, ACE_TRACE, ACE_TLI_Stream::close(), ACE_IPC_SAP::disable(), ACE_Addr::get_addr(), ACE_IPC_SAP::get_handle(), ACE_Addr::get_size(), ACE::handle_timed_complete(), ACE_Time_Value::msec(), ACE_OS::t_getname(), ACE_OS::t_look(), and t_rcvconnect().

Referenced by ACE_XTI_ATM_Mcast::add_leaf(), and connect().

00203 {
00204   ACE_TRACE ("ACE_TLI_Connector::complete");
00205 #if defined (ACE_WIN32)
00206    if (WaitForSingleObject (new_stream.get_handle(), tv->msec()) == WAIT_OBJECT_0)
00207     {
00208       if (ACE_OS::t_look (new_stream.get_handle()) == T_CONNECT)
00209         return t_rcvconnect (new_stream.get_handle(), 0);
00210       else
00211         return -1;
00212     }
00213   else
00214     return -1;
00215 #else
00216   ACE_HANDLE h = ACE::handle_timed_complete (new_stream.get_handle (),
00217                                              tv,
00218                                              1);
00219   if (h == ACE_INVALID_HANDLE)
00220     {
00221       new_stream.close ();
00222       return -1;
00223     }
00224   else    // We've successfully connected!
00225     {
00226       if (remote_sap != 0)
00227         {
00228 #if defined (ACE_HAS_XTI) || defined (ACE_HAS_SVR4_TLI)
00229           struct netbuf name;
00230 
00231           name.maxlen = remote_sap->get_size ();
00232           name.buf    = (char *) remote_sap->get_addr ();
00233 
00234           if (ACE_OS::t_getname (new_stream.get_handle (),
00235                                  &name,
00236                                  REMOTENAME) == -1)
00237 #else /* SunOS4 */
00238           if (0)
00239 #endif /* ACE_HAS_XTI || ACE_HAS_SVR4_TLI */
00240             {
00241               new_stream.close ();
00242               return -1;
00243             }
00244         }
00245 
00246       // Start out with non-blocking disabled on the <new_stream>.
00247       new_stream.disable (ACE_NONBLOCK);
00248 
00249       return 0;
00250     }
00251 #endif /* ACE_WIN32 */
00252 }

int ACE_TLI_Connector::connect ACE_TLI_Stream new_stream,
const ACE_Addr remote_sap,
ACE_Time_Value timeout = 0,
const ACE_Addr local_sap = ACE_Addr::sap_any,
int  reuse_addr = 0,
int  flags = O_RDWR,
int  perms = 0,
const char  device[] = ACE_TLI_TCP_DEVICE,
struct t_info *  info = 0,
int  rw_flag = 1,
struct netbuf *  udata = 0,
struct netbuf *  opt = 0
 

Actively connect and produce a if things go well. The is the address that we are trying to connect with. The is the amount of time to wait to connect. If it's 0 then we block indefinitely. If *timeout == {0, 0} then the connection is done using non-blocking mode. In this case, if the connection can't be made immediately the value of -1 is returned with <errno == EWOULDBLOCK>. If *timeout > {0, 0} then this is the maximum amount of time to wait before timing out. If the time expires before the connection is made <errno == ETIME>. The is the value of local address to bind to. If it's the default value of <ACE_Addr::sap_any> then the user is letting the OS do the binding. If == 1 then the is reused, even if it hasn't been cleanedup yet.

Reimplemented in ACE_XTI_ATM_Mcast.

Definition at line 40 of file TLI_Connector.cpp.

References ACE_NONBLOCK, ACE_TRACE, ACE_TLI_Stream::close(), complete(), ACE_IPC_SAP::enable(), ETIME, EWOULDBLOCK, ACE_Addr::get_addr(), ACE_IPC_SAP::get_handle(), ACE_TLI_Stream::get_rwflag(), ACE_Addr::get_size(), ACE_OS::ioctl(), ACE_TLI::look(), ACE_OS::memcpy(), ACE_TLI::open(), ACE_TLI::rcvdis(), ACE_Time_Value::sec(), ACE_IPC_SAP::set_handle(), ACE_TLI::set_option(), ACE_TLI_Stream::set_rwflag(), ACE_OS::t_alloc(), ACE_OS::t_bind(), t_bind(), ACE_OS::t_connect(), ACE_OS::t_free(), and ACE_Time_Value::usec().

Referenced by ACE_TLI_Connector(), and ACE_XTI_ATM_Mcast::connect().

00052 {
00053   ACE_TRACE ("ACE_TLI_Connector::connect");
00054   int result = 0;
00055 
00056   // Only open a new endpoint if we don't already have a valid handle.
00057 
00058   if (new_stream.get_handle () == ACE_INVALID_HANDLE
00059       && new_stream.open (device, flags, info) == ACE_INVALID_HANDLE)
00060     return -1;
00061 
00062   if (local_sap != ACE_Addr::sap_any)
00063     {
00064       // Bind the local endpoint to a specific addr.
00065 
00066       struct t_bind *localaddr;
00067 
00068       localaddr = (struct t_bind *)
00069         ACE_OS::t_alloc (new_stream.get_handle (), T_BIND, T_ADDR);
00070 
00071       if (localaddr == 0)
00072         result = -1;
00073       else
00074         {
00075           int one = 1;
00076 #if !defined (ACE_HAS_FORE_ATM_XTI)
00077           // Reusing the address causes problems with FORE's API. The
00078           // issue may be that t_optmgmt isn't fully supported by
00079           // FORE. t_errno is TBADOPT after the t_optmgmt call so
00080           // maybe options are configured differently for XTI than for
00081           // TLI (at least for FORE's implementation - XTI is supposed
00082           // to be a superset of TLI).
00083           if (reuse_addr
00084               && new_stream.set_option (SOL_SOCKET,
00085                                         SO_REUSEADDR,
00086                                         &one,
00087                                         sizeof one) == -1)
00088             result = -1;
00089           else
00090 #endif /* ACE_HAS_FORE_ATM_XTI */
00091             {
00092               void *addr_buf = local_sap.get_addr ();
00093               localaddr->addr.len = local_sap.get_size ();
00094               ACE_OS::memcpy(localaddr->addr.buf,
00095                              addr_buf,
00096                              localaddr->addr.len);
00097 
00098               if (ACE_OS::t_bind (new_stream.get_handle (),
00099                                   localaddr,
00100                                   localaddr) == -1)
00101                 result = -1;
00102 
00103               ACE_OS::t_free ((char *) localaddr,
00104                               T_BIND);
00105             }
00106         }
00107 
00108       if (result == -1)
00109         {
00110           new_stream.close ();
00111           return -1;
00112         }
00113     }
00114   // Let TLI select the local endpoint addr.
00115   else if (ACE_OS::t_bind (new_stream.get_handle (), 0, 0) == -1)
00116     return -1;
00117 
00118   struct t_call *callptr = 0;
00119 
00120   callptr = (struct t_call *)
00121     ACE_OS::t_alloc (new_stream.get_handle (), T_CALL, T_ADDR);
00122 
00123   if (callptr == 0)
00124     {
00125       new_stream.close ();
00126       return -1;
00127     }
00128 
00129   void *addr_buf = remote_sap.get_addr ();
00130   callptr->addr.len = remote_sap.get_size ();
00131   ACE_OS::memcpy (callptr->addr.buf,
00132                   addr_buf,
00133                   callptr->addr.len);
00134   //callptr->addr.buf = (char *) remote_sap.get_addr ();
00135 
00136   if (udata != 0)
00137     ACE_OS::memcpy ((void *) &callptr->udata, (void *) udata, sizeof *udata);
00138   if (opt != 0)
00139     ACE_OS::memcpy ((void *) &callptr->opt, (void *) opt, sizeof *opt);
00140 
00141   // Connect to remote endpoint.
00142 #if defined (ACE_HAS_FORE_ATM_XTI)
00143   // FORE's XTI/ATM driver has problems with ioctl/fcntl calls so (at least
00144   // for now) always have blocking calls.
00145   timeout = 0;
00146 #endif /* ACE_HAS_FORE_ATM_XTI */
00147 
00148   if (timeout != 0)   // Enable non-blocking, if required.
00149     {
00150       if (new_stream.enable (ACE_NONBLOCK) == -1)
00151         result = -1;
00152 
00153       // Do a non-blocking connect.
00154       if (ACE_OS::t_connect (new_stream.get_handle (), callptr, 0) == -1)
00155         {
00156           result = -1;
00157 
00158           // Check to see if we simply haven't connected yet on a
00159           // non-blocking handle or whether there's really an error.
00160           if (t_errno == TNODATA)
00161             {
00162               if (timeout->sec () == 0 && timeout->usec () == 0)
00163                 errno = EWOULDBLOCK;
00164               else
00165                 result = this->complete (new_stream, 0, timeout);
00166             }
00167           else if (t_errno == TLOOK && new_stream.look () == T_DISCONNECT)
00168             new_stream.rcvdis ();
00169         }
00170     }
00171   // Do a blocking connect to the server.
00172   else if (ACE_OS::t_connect (new_stream.get_handle (), callptr, 0) == -1)
00173     result = -1;
00174 
00175   if (result != -1)
00176     {
00177       new_stream.set_rwflag (rwf);
00178 #if defined (I_PUSH) && !defined (ACE_HAS_FORE_ATM_XTI)
00179       if (new_stream.get_rwflag ())
00180         result = ACE_OS::ioctl (new_stream.get_handle (),
00181                                 I_PUSH,
00182                                 const_cast<char *> ("tirdwr"));
00183 #endif /* I_PUSH */
00184     }
00185   else if (!(errno == EWOULDBLOCK || errno == ETIME))
00186     {
00187       // If things have gone wrong, close down and return an error.
00188       new_stream.close ();
00189       new_stream.set_handle (ACE_INVALID_HANDLE);
00190     }
00191 
00192   if (ACE_OS::t_free ((char *) callptr, T_CALL) == -1)
00193     return -1;
00194   return result;
00195 }

ACE_BEGIN_VERSIONED_NAMESPACE_DECL void ACE_TLI_Connector::dump void   )  const
 

Dump the state of an object.

Reimplemented in ACE_XTI_ATM_Mcast.

Definition at line 23 of file TLI_Connector.cpp.

References ACE_TRACE.

00024 {
00025 #if defined (ACE_HAS_DUMP)
00026   ACE_TRACE ("ACE_TLI_Connector::dump");
00027 #endif /* ACE_HAS_DUMP */
00028 }

ACE_INLINE int ACE_TLI_Connector::reset_new_handle ACE_HANDLE  handle  ) 
 

Resets any event associations on this handle.

Definition at line 42 of file TLI_Connector.inl.

00043 {
00044   ACE_UNUSED_ARG (handle);
00045   // Nothing to do here since the handle is not a socket
00046   return 0;
00047 }


Member Data Documentation

ACE_TLI_Connector::ACE_ALLOC_HOOK_DECLARE
 

Declare the dynamic allocation hooks.

Reimplemented in ACE_XTI_ATM_Mcast.

Definition at line 119 of file TLI_Connector.h.


The documentation for this class was generated from the following files:
Generated on Thu Nov 9 11:31:36 2006 for ACE by doxygen 1.3.6