Public Types | Public Member Functions | Public Attributes | Protected Member Functions

ACE_SOCK_SEQPACK_Connector Class Reference

Defines a factory that actively connects to a remote IP address and TCP port, creating a new ACE_SOCK_SEQPACK_Association object. More...

#include <SOCK_SEQPACK_Connector.h>

List of all members.

Public Types

typedef ACE_Multihomed_INET_Addr PEER_ADDR
typedef
ACE_SOCK_SEQPACK_Association 
PEER_STREAM

Public Member Functions

 ACE_SOCK_SEQPACK_Connector (void)
 Default constructor.
 ACE_SOCK_SEQPACK_Connector (ACE_SOCK_SEQPACK_Association &new_association, const ACE_Addr &remote_sap, const ACE_Time_Value *timeout=0, const ACE_Addr &local_sap=ACE_Addr::sap_any, int reuse_addr=0, int flags=0, int perms=0, int protocol=132)
 ACE_SOCK_SEQPACK_Connector (ACE_SOCK_SEQPACK_Association &new_association, const ACE_Addr &remote_sap, const ACE_Time_Value *timeout, const ACE_Multihomed_INET_Addr &local_sap, int reuse_addr=0, int flags=0, int perms=0, int protocol=132)
int connect (ACE_SOCK_SEQPACK_Association &new_association, const ACE_Addr &remote_sap, const ACE_Time_Value *timeout=0, const ACE_Addr &local_sap=ACE_Addr::sap_any, int reuse_addr=0, int flags=0, int perms=0, int protocol=132)
int connect (ACE_SOCK_SEQPACK_Association &new_association, const ACE_Addr &remote_sap, const ACE_Time_Value *timeout, const ACE_Multihomed_INET_Addr &local_sap, int reuse_addr=0, int flags=0, int perms=0, int protocol=132)
 ~ACE_SOCK_SEQPACK_Connector (void)
 Default dtor.
int complete (ACE_SOCK_SEQPACK_Association &new_association, ACE_Addr *remote_sap=0, const ACE_Time_Value *timeout=0)
bool 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.

Protected Member Functions

int shared_open (ACE_SOCK_SEQPACK_Association &new_association, int protocol_family, int protocol, int reuse_addr)
int shared_open (ACE_SOCK_SEQPACK_Association &new_association, int protocol_family, int protocol, ACE_Protocol_Info *protocolinfo, ACE_SOCK_GROUP g, u_long flags, int reuse_addr)
int shared_connect_start (ACE_SOCK_SEQPACK_Association &new_association, const ACE_Time_Value *timeout, const ACE_Addr &local_sap)
 Perform operations that must be called before <ACE_OS::connect>.
int shared_connect_start (ACE_SOCK_SEQPACK_Association &new_association, const ACE_Time_Value *timeout, const ACE_Multihomed_INET_Addr &local_sap)
int shared_connect_finish (ACE_SOCK_SEQPACK_Association &new_association, const ACE_Time_Value *timeout, int result)
 Perform operations that must be called after <ACE_OS::connect>.

Detailed Description

Defines a factory that actively connects to a remote IP address and TCP port, creating a new ACE_SOCK_SEQPACK_Association object.

The ACE_SOCK_SEQPACK_Connector doesn't have a socket of its own, i.e., it simply "borrows" the one from the ACE_SOCK_SEQPACK_Association that's being connected. The reason for this is that the underlying socket API doesn't use a factory socket to connect data mode sockets. Therefore, there's no need to inherit ACE_SOCK_SEQPACK_Connector from ACE_SOCK. A nice side-effect of this is that ACE_SOCK_SEQPACK_Connector objects do not store state so they can be used reentrantly in multithreaded programs.

Definition at line 51 of file SOCK_SEQPACK_Connector.h.


Member Typedef Documentation

Definition at line 281 of file SOCK_SEQPACK_Connector.h.

Definition at line 282 of file SOCK_SEQPACK_Connector.h.


Constructor & Destructor Documentation

ACE_SOCK_SEQPACK_Connector::ACE_SOCK_SEQPACK_Connector ( void   ) 

Default constructor.

Definition at line 19 of file SOCK_SEQPACK_Connector.inl.

{
  ACE_TRACE ("ACE_SOCK_SEQPACK_Connector::ACE_SOCK_SEQPACK_Connector");
}

ACE_SOCK_SEQPACK_Connector::ACE_SOCK_SEQPACK_Connector ( ACE_SOCK_SEQPACK_Association new_association,
const ACE_Addr remote_sap,
const ACE_Time_Value timeout = 0,
const ACE_Addr local_sap = ACE_Addr::sap_any,
int  reuse_addr = 0,
int  flags = 0,
int  perms = 0,
int  protocol = 132 
)

Actively connect to a peer, producing a connected ACE_SOCK_SEQPACK_Association object if the connection succeeds.

Parameters:
new_association The ACE_SOCK_SEQPACK_Association object that will be connected to the peer.
remote_sap The address that we are trying to connect to. The protocol family of remote_sap is used for the connected socket. That is, if remote_sap contains an IPv6 address, a socket with family PF_INET6 will be used, else it will be PF_INET.
timeout Pointer to an ACE_Time_Value object with amount of time to wait to connect. If the pointer is 0 then the call blocks until the connection attempt is complete, whether it succeeds or fails. If *timeout == {0, 0} then the connection is done using nonblocking mode. In this case, if the connection can't be made immediately, this method returns -1 and errno == EWOULDBLOCK. If *timeout > {0, 0} then this is the maximum amount of time to wait before timing out; if the specified amount of time passes before the connection is made, this method returns -1 and errno == ETIME. Note the difference between this case and when a blocking connect is attempted that TCP times out - in the latter case, errno will be ETIMEDOUT.
local_sap (optional) The local address to bind to. If it's the default value of ACE_Addr::sap_any then the OS will choose an unused port.
reuse_addr (optional) If the value is 1, the local address (local_sap) is reused, even if it hasn't been cleaned up yet.
flags Ignored.
perms Ignored.
protocol (optional) If value is 0, default SOCK_STREAM protocol is selected by kernel (typically TCP).
Returns:
Returns 0 if the connection succeeds. If it fails, -1 is returned and errno contains a specific error code.

Definition at line 389 of file SOCK_SEQPACK_Connector.cpp.

{
  ACE_TRACE ("ACE_SOCK_SEQPACK_Connector::ACE_SOCK_SEQPACK_Connector");

  if (this->connect (new_association,
                     remote_sap,
                     timeout,
                     local_sap,
                     reuse_addr,
                     flags,
                     perms,
                     protocol) == -1
      && timeout != 0
      && !(errno == EWOULDBLOCK || errno == ETIME || errno == ETIMEDOUT))
    ACE_ERROR ((LM_ERROR,
                ACE_TEXT ("%p\n"),
                ACE_TEXT ("ACE_SOCK_SEQPACK_Connector::ACE_SOCK_SEQPACK_Connector")));
}

ACE_SOCK_SEQPACK_Connector::ACE_SOCK_SEQPACK_Connector ( ACE_SOCK_SEQPACK_Association new_association,
const ACE_Addr remote_sap,
const ACE_Time_Value timeout,
const ACE_Multihomed_INET_Addr local_sap,
int  reuse_addr = 0,
int  flags = 0,
int  perms = 0,
int  protocol = 132 
)

Actively connect to a peer, producing a connected ACE_SOCK_SEQPACK_Association object if the connection succeeds.

Parameters:
new_association The ACE_SOCK_SEQPACK_Association object that will be connected to the peer.
remote_sap The address that we are trying to connect to. The protocol family of remote_sap is used for the connected socket. That is, if remote_sap contains an IPv6 address, a socket with family PF_INET6 will be used, else it will be PF_INET.
timeout Pointer to an ACE_Time_Value object with amount of time to wait to connect. If the pointer is 0 then the call blocks until the connection attempt is complete, whether it succeeds or fails. If *timeout == {0, 0} then the connection is done using nonblocking mode. In this case, if the connection can't be made immediately, this method returns -1 and errno == EWOULDBLOCK. If *timeout > {0, 0} then this is the maximum amount of time to wait before timing out; if the specified amount of time passes before the connection is made, this method returns -1 and errno == ETIME. Note the difference between this case and when a blocking connect is attempted that TCP times out - in the latter case, errno will be ETIMEDOUT.
local_sap (optional) The set of local addresses for SCTP to bind to.
reuse_addr (optional) If the value is 1, the local address (local_sap) is reused, even if it hasn't been cleaned up yet.
flags Ignored.
perms Ignored.
protocol (optional) If value is 0, default SOCK_STREAM protocol is selected by kernel (typically TCP).
Returns:
Returns 0 if the connection succeeds. If it fails, -1 is returned and errno contains a specific error code.

Definition at line 416 of file SOCK_SEQPACK_Connector.cpp.

{
  ACE_TRACE ("ACE_SOCK_SEQPACK_Connector::ACE_SOCK_SEQPACK_Connector");

  if (this->connect (new_association,
                     remote_sap,
                     timeout,
                     local_sap,
                     reuse_addr,
                     flags,
                     perms,
                     protocol) == -1
      && timeout != 0
      && !(errno == EWOULDBLOCK || errno == ETIME || errno == ETIMEDOUT))
    ACE_ERROR ((LM_ERROR,
                ACE_TEXT ("%p\n"),
                ACE_TEXT ("ACE_SOCK_SEQPACK_Connector::ACE_SOCK_SEQPACK_Connector")));
}

ACE_SOCK_SEQPACK_Connector::~ACE_SOCK_SEQPACK_Connector ( void   ) 

Default dtor.

Definition at line 11 of file SOCK_SEQPACK_Connector.inl.

{
  ACE_TRACE ("ACE_SOCK_SEQPACK_Connector::~ACE_SOCK_SEQPACK_Connector");
}


Member Function Documentation

int ACE_SOCK_SEQPACK_Connector::complete ( ACE_SOCK_SEQPACK_Association new_association,
ACE_Addr remote_sap = 0,
const ACE_Time_Value timeout = 0 
)

Try to complete a nonblocking connection that was begun by a previous call to connect with a {0, 0} ACE_Time_Value timeout.

See also:
connect().
Parameters:
new_association The ACE_SOCK_SEQPACK_Association object that will be connected to the peer.
remote_sap If non-0, it points to the ACE_INET_Addr object that will contain the address of the connected peer.
timeout Same values and return value possibilites as for connect().
See also:
connect().

Definition at line 338 of file SOCK_SEQPACK_Connector.cpp.

{
  ACE_TRACE ("ACE_SOCK_SEQPACK_Connector::complete");
  ACE_HANDLE h = ACE::handle_timed_complete (new_association.get_handle (),
                                             tv);
  // We failed to get connected.
  if (h == ACE_INVALID_HANDLE)
    {
#if defined (ACE_WIN32)
      // Win32 has a timing problem - if you check to see if the
      // connection has completed too fast, it will fail - so wait
      // <ACE_NON_BLOCKING_BUG_DELAY> microseconds to let it catch up
      // then retry to see if it's a real failure.
      ACE_Time_Value time (0, ACE_NON_BLOCKING_BUG_DELAY);
      ACE_OS::sleep (time);
      h = ACE::handle_timed_complete (new_association.get_handle (),
                                      tv);
      if (h == ACE_INVALID_HANDLE)
        {
#endif /* ACE_WIN32 */
      // Save/restore errno.
      ACE_Errno_Guard error (errno);
      new_association.close ();
      return -1;
#if defined (ACE_WIN32)
        }
#endif /* ACE_WIN32 */
    }

  if (remote_sap != 0)
    {
      int len = remote_sap->get_size ();
      sockaddr *addr = reinterpret_cast<sockaddr *> (remote_sap->get_addr ());
      if (ACE_OS::getpeername (h,
                               addr,
                               &len) == -1)
        {
          // Save/restore errno.
          ACE_Errno_Guard error (errno);
          new_association.close ();
          return -1;
        }
    }

  // Start out with non-blocking disabled on the <new_association>.
  new_association.disable (ACE_NONBLOCK);
  return 0;
}

int ACE_SOCK_SEQPACK_Connector::connect ( ACE_SOCK_SEQPACK_Association new_association,
const ACE_Addr remote_sap,
const ACE_Time_Value timeout,
const ACE_Multihomed_INET_Addr local_sap,
int  reuse_addr = 0,
int  flags = 0,
int  perms = 0,
int  protocol = 132 
)

Actively connect to a peer, producing a connected ACE_SOCK_SEQPACK_Association object if the connection succeeds.

Parameters:
new_association The ACE_SOCK_SEQPACK_Association object that will be connected to the peer.
remote_sap The address that we are trying to connect to. The protocol family of remote_sap is used for the connected socket. That is, if remote_sap contains an IPv6 address, a socket with family PF_INET6 will be used, else it will be PF_INET.
timeout Pointer to an ACE_Time_Value object with amount of time to wait to connect. If the pointer is 0 then the call blocks until the connection attempt is complete, whether it succeeds or fails. If *timeout == {0, 0} then the connection is done using nonblocking mode. In this case, if the connection can't be made immediately, this method returns -1 and errno == EWOULDBLOCK. If *timeout > {0, 0} then this is the maximum amount of time to wait before timing out; if the specified amount of time passes before the connection is made, this method returns -1 and errno == ETIME. Note the difference between this case and when a blocking connect is attempted that TCP times out - in the latter case, errno will be ETIMEDOUT.
local_sap (optional) The set of local addresses for SCTP to bind to.
reuse_addr (optional) If the value is 1, the local address (local_sap) is reused, even if it hasn't been cleaned up yet.
flags Ignored.
perms Ignored.
protocol (optional) If value is 0, default SOCK_STREAM protocol is selected by kernel (typically TCP).
Returns:
Returns 0 if the connection succeeds. If it fails, -1 is returned and errno contains a specific error code.

Definition at line 305 of file SOCK_SEQPACK_Connector.cpp.

{
  ACE_TRACE ("ACE_SOCK_SEQPACK_Connector::connect");

  if (this->shared_open (new_association,
                         remote_sap.get_type (),
                         protocol,
                         reuse_addr) == -1)
    return -1;
  else if (this->shared_connect_start (new_association,
                                       timeout,
                                       local_sap) == -1)
    return -1;

  int result = ACE_OS::connect (new_association.get_handle (),
                                reinterpret_cast<sockaddr *> (remote_sap.get_addr ()),
                                remote_sap.get_size ());

  return this->shared_connect_finish (new_association,
                                      timeout,
                                      result);
}

int ACE_SOCK_SEQPACK_Connector::connect ( ACE_SOCK_SEQPACK_Association new_association,
const ACE_Addr remote_sap,
const ACE_Time_Value timeout = 0,
const ACE_Addr local_sap = ACE_Addr::sap_any,
int  reuse_addr = 0,
int  flags = 0,
int  perms = 0,
int  protocol = 132 
)

Actively connect to a peer, producing a connected ACE_SOCK_SEQPACK_Association object if the connection succeeds.

Parameters:
new_association The ACE_SOCK_SEQPACK_Association object that will be connected to the peer.
remote_sap The address that we are trying to connect to. The protocol family of remote_sap is used for the connected socket. That is, if remote_sap contains an IPv6 address, a socket with family PF_INET6 will be used, else it will be PF_INET.
timeout Pointer to an ACE_Time_Value object with amount of time to wait to connect. If the pointer is 0 then the call blocks until the connection attempt is complete, whether it succeeds or fails. If *timeout == {0, 0} then the connection is done using nonblocking mode. In this case, if the connection can't be made immediately, this method returns -1 and errno == EWOULDBLOCK. If *timeout > {0, 0} then this is the maximum amount of time to wait before timing out; if the specified amount of time passes before the connection is made, this method returns -1 and errno == ETIME. Note the difference between this case and when a blocking connect is attempted that TCP times out - in the latter case, errno will be ETIMEDOUT.
local_sap (optional) The local address to bind to. If it's the default value of ACE_Addr::sap_any then the OS will choose an unused port.
reuse_addr (optional) If the value is 1, the local address (local_sap) is reused, even if it hasn't been cleaned up yet.
flags Ignored.
perms Ignored.
protocol (optional) If value is 0, default SOCK_STREAM protocol is selected by kernel (typically TCP).
Returns:
Returns 0 if the connection succeeds. If it fails, -1 is returned and errno contains a specific error code.

Definition at line 273 of file SOCK_SEQPACK_Connector.cpp.

{
  ACE_TRACE ("ACE_SOCK_SEQPACK_Connector::connect");

  if (this->shared_open (new_association,
                         remote_sap.get_type (),
                         protocol,
                         reuse_addr) == -1)
    return -1;
  else if (this->shared_connect_start (new_association,
                                       timeout,
                                       local_sap) == -1)
    return -1;

  int result = ACE_OS::connect (new_association.get_handle (),
                                reinterpret_cast<sockaddr *> (remote_sap.get_addr ()),
                                remote_sap.get_size ());

  return this->shared_connect_finish (new_association,
                                      timeout,
                                      result);
}

void ACE_SOCK_SEQPACK_Connector::dump ( void   )  const

Dump the state of an object.

Definition at line 28 of file SOCK_SEQPACK_Connector.cpp.

{
#if defined (ACE_HAS_DUMP)
  ACE_TRACE ("ACE_SOCK_SEQPACK_Connector::dump");
#endif /* ACE_HAS_DUMP */
}

bool ACE_SOCK_SEQPACK_Connector::reset_new_handle ( ACE_HANDLE  handle  ) 

Resets any event associations on this handle.

Definition at line 25 of file SOCK_SEQPACK_Connector.inl.

{
#if defined (ACE_HAS_WINSOCK2) && (ACE_HAS_WINSOCK2 != 0)
  // Reset the event association
  return ::WSAEventSelect ((SOCKET) handle,
                           0,
                           0);
#else /* !defined ACE_HAS_WINSOCK2 */
  ACE_UNUSED_ARG (handle);
  return false;
#endif /* ACE_WIN32 */
}

int ACE_SOCK_SEQPACK_Connector::shared_connect_finish ( ACE_SOCK_SEQPACK_Association new_association,
const ACE_Time_Value timeout,
int  result 
) [protected]

Perform operations that must be called after <ACE_OS::connect>.

Definition at line 232 of file SOCK_SEQPACK_Connector.cpp.

{
  ACE_TRACE ("ACE_SOCK_SEQPACK_Connector::shared_connect_finish");
  // Save/restore errno.
  ACE_Errno_Guard error (errno);

  if (result == -1 && timeout != 0)
    {
      // Check whether the connection is in progress.
      if (error == EINPROGRESS || error == EWOULDBLOCK)
        {
          // This expression checks if we were polling.
          if (*timeout == ACE_Time_Value::zero)
            error = EWOULDBLOCK;
          // Wait synchronously using timeout.
          else if (this->complete (new_association,
                                   0,
                                   timeout) == -1)
            error = errno;
          else
            return 0;
        }
    }

  // EISCONN is treated specially since this routine may be used to
  // check if we are already connected.
  if (result != -1 || error == EISCONN)
    // Start out with non-blocking disabled on the <new_association>.
    new_association.disable (ACE_NONBLOCK);
  else if (!(error == EWOULDBLOCK || error == ETIMEDOUT))
    new_association.close ();

  return result;
}

int ACE_SOCK_SEQPACK_Connector::shared_connect_start ( ACE_SOCK_SEQPACK_Association new_association,
const ACE_Time_Value timeout,
const ACE_Addr local_sap 
) [protected]

Perform operations that must be called before <ACE_OS::connect>.

Definition at line 90 of file SOCK_SEQPACK_Connector.cpp.

{
  ACE_TRACE ("ACE_SOCK_SEQPACK_Connector::shared_connect_start");

  if (local_sap != ACE_Addr::sap_any)
    {
      sockaddr *laddr = reinterpret_cast<sockaddr *> (local_sap.get_addr ());
      int size = local_sap.get_size ();

      if (ACE_OS::bind (new_association.get_handle (),
                        laddr,
                        size) == -1)
        {
          // Save/restore errno.
          ACE_Errno_Guard error (errno);
          new_association.close ();
          return -1;
        }
    }

  // Enable non-blocking, if required.
  if (timeout != 0
      && new_association.enable (ACE_NONBLOCK) == -1)
    return -1;
  else
    return 0;
}

int ACE_SOCK_SEQPACK_Connector::shared_connect_start ( ACE_SOCK_SEQPACK_Association new_association,
const ACE_Time_Value timeout,
const ACE_Multihomed_INET_Addr local_sap 
) [protected]

Definition at line 122 of file SOCK_SEQPACK_Connector.cpp.

{
  ACE_TRACE ("ACE_SOCK_SEQPACK_Connector::shared_connect_start");

  if (local_sap.ACE_Addr::operator!= (ACE_Addr::sap_any))
    {
      // The total number of addresses is the number of secondary
      // addresses plus one.
      size_t num_addresses = local_sap.get_num_secondary_addresses() + 1;

      // Create an array of sockaddr_in to hold the underlying
      // representations of the primary and secondary
      // addresses.
      sockaddr_in*  local_inet_addrs = 0;
      ACE_NEW_NORETURN (local_inet_addrs, sockaddr_in[num_addresses]);
      if (!local_inet_addrs)
        return -1;

      // Populate the array by invoking the get_addresses method on
      // the Multihomed_INET_Addr
      local_sap.get_addresses(local_inet_addrs, num_addresses);

#if defined (ACE_HAS_LKSCTP)
      sockaddr_in *local_sockaddr = 0;
      sockaddr_in portst;
      int sn = sizeof(sockaddr);

      // bind to the primary addr first
      if (ACE_OS::bind(new_association.get_handle (),
                       reinterpret_cast<sockaddr *> (&(local_inet_addrs[0])),
                       sizeof(sockaddr)))
      {
        ACE_Errno_Guard error (errno);
        new_association.close ();
        return -1;
      }

      // do we need to bind multiple addrs
      if (num_addresses > 1)
      {
        // allocate enough memory to hold the number of secondary addrs
        ACE_NEW_NORETURN(local_sockaddr,
                         sockaddr_in[num_addresses - 1]);

        // get sockaddr_in for the local handle
        if (ACE_OS::getsockname(new_association.get_handle (),
                                reinterpret_cast<sockaddr *> (&portst),
                                                     &sn))
        {
          ACE_Errno_Guard error (errno);
          new_association.close ();
          return -1;
        }

        // set the local port # assigned by the os to every secondary addr
        for (size_t i = 1; i < num_addresses; i++)
        {
          local_inet_addrs[i].sin_port = portst.sin_port;
        }

        // copy all of the secondary addrs into a sockaddr structure
        for (size_t i = 0; i < num_addresses - 1; i++)
        {
          ACE_OS::memcpy(&(local_sockaddr[i]),
                         &(local_inet_addrs[i + 1]),
                         sizeof(sockaddr_in));
        }

        // bind other ifaces
        if (sctp_bindx(new_association.get_handle(),
                       reinterpret_cast<sockaddr *> (local_sockaddr),
                       num_addresses - 1,
                       SCTP_BINDX_ADD_ADDR))
        {
          ACE_Errno_Guard error (errno);
          new_association.close ();
          return -1;
        }

        delete [] local_sockaddr;
      }
#else

      // Call bind
      size_t name_len = (sizeof (sockaddr_in)) * num_addresses;
      if (ACE_OS::bind (new_association.get_handle (),
                        reinterpret_cast<sockaddr *> (local_inet_addrs),
                        static_cast<int> (name_len)) == -1)
        {
          // Save/restore errno.
          ACE_Errno_Guard error (errno);
          new_association.close ();
          return -1;
        }
#endif /* ACE_HAS_LKSCTP */

      delete [] local_inet_addrs;
    }

  // Enable non-blocking, if required.
  if (timeout != 0
      && new_association.enable (ACE_NONBLOCK) == -1)
    return -1;
  else
    return 0;
}

int ACE_SOCK_SEQPACK_Connector::shared_open ( ACE_SOCK_SEQPACK_Association new_association,
int  protocol_family,
int  protocol,
int  reuse_addr 
) [protected]

Perform operations that ensure the socket is opened using BSD-style semantics (no QoS).

Definition at line 36 of file SOCK_SEQPACK_Connector.cpp.

{
  ACE_TRACE ("ACE_SOCK_SEQPACK_Connector::shared_open");



  // Only open a new socket if we don't already have a valid handle.
  if (new_association.get_handle () == ACE_INVALID_HANDLE &&
#if defined (ACE_HAS_LKSCTP)
         new_association.open (SOCK_STREAM,
#else
         new_association.open (SOCK_SEQPACKET,
#endif /* ACE_HAS_LKSCTP */
                               protocol_family,
                               protocol,
                               reuse_addr) == -1)
    return -1;
  else
    return 0;
}

int ACE_SOCK_SEQPACK_Connector::shared_open ( ACE_SOCK_SEQPACK_Association new_association,
int  protocol_family,
int  protocol,
ACE_Protocol_Info protocolinfo,
ACE_SOCK_GROUP  g,
u_long  flags,
int  reuse_addr 
) [protected]

Perform operations that ensure the socket is opened using QoS-enabled semantics.

Definition at line 61 of file SOCK_SEQPACK_Connector.cpp.

{
  ACE_TRACE ("ACE_SOCK_SEQPACK_Connector::shared_open");

  // Only open a new socket if we don't already have a valid handle.
  if (new_association.get_handle () == ACE_INVALID_HANDLE &&
#if defined (ACE_HAS_LKSCTP)
      new_association.open (SOCK_STREAM,
#else
      new_association.open (SOCK_SEQPACKET,
#endif /* ACE_HAS_LKSCTP */
                               protocol_family,
                               protocol,
                               protocolinfo,
                               g,
                               flags,
                               reuse_addr) == -1)
      return -1;
  else
    return 0;
}


Member Data Documentation

Declare the dynamic allocation hooks.

Definition at line 288 of file SOCK_SEQPACK_Connector.h.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines