## NAME

ACE_SOCK_Connector - Defines a factory that creates new `ACE_Stream`s actively.

## SYNOPSIS

    #include <ace/SOCK_Connector.h>

    class ACE_SOCK_Connector
    {
      public:
        ACE_SOCK_Connector (void);
        ACE_SOCK_Connector (
            ACE_SOCK_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 = 0,
            int perms = 0,
            int protocol_family = PF_INET,
            int protocol = 0
            );
        ACE_SOCK_Connector (
            ACE_SOCK_Stream &new_stream,
            const ACE_Addr &remote_sap,
            ACE_QoS_Params qos_params,
            ACE_Time_Value *timeout = 0,
            const ACE_Addr &local_sap = ACE_Addr::sap_any,
            ACE_Protocol_Info *protocolinfo = 0,
            ACE_SOCK_GROUP g = 0,
            u_long flags = 0,
            int reuse_addr = 0,
            int perms = 0,
            int protocol_family = PF_INET,
            int protocol = 0
            );
        int connect (
            ACE_SOCK_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 = 0,
            int perms = 0,
            int protocol_family = PF_INET,
            int protocol = 0
            );
        int connect (
            ACE_SOCK_Stream &new_stream,
            const ACE_Addr &remote_sap,
            ACE_QoS_Params qos_params,
            ACE_Time_Value *timeout = 0,
            const ACE_Addr &local_sap = ACE_Addr::sap_any,
            ACE_Protocol_Info *protocolinfo = 0,
            ACE_SOCK_GROUP g = 0,
            u_long flags = 0,
            int reuse_addr = 0,
            int perms = 0,
            int protocol_family = PF_INET,
            int protocol = 0
            );
        ~ACE_SOCK_Connector (void);
        int complete (
            ACE_SOCK_Stream &new_stream,
            ACE_Addr *remote_sap = 0,
            ACE_Time_Value *timeout = 0
            );
        int reset_new_handle (ACE_HANDLE handle);
        typedef ACE_INET_Addr PEER_ADDR;
        typedef ACE_SOCK_Stream PEER_STREAM;
        void dump (void) const;
        ACE_ALLOC_HOOK_DECLARE;
      protected:
        int shared_open (
            ACE_SOCK_Stream &new_stream,
            int protocol_family,
            int protocol,
            int reuse_addr
            );
        int shared_open (
            ACE_SOCK_Stream &new_stream,
            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_Stream &new_stream,
            ACE_Time_Value *timeout,
            const ACE_Addr &local_sap
            );
        int shared_connect_finish (
            ACE_SOCK_Stream &new_stream,
            ACE_Time_Value *timeout,
            int result
            );
    };

## DESCRIPTION

The `ACE_SOCK_Connector` doesn't have a socket of its own, i.e., it simply "borrows" the one from the ACE_SOCK_Stream 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_Connector` from `ACE_SOCK`. A nice side-effect of this is that `ACE_SOCK_Connector`'s do not store state so they can be used reentrantly in multi-threaded programs.

## Initialization and termination methods.

    ACE_SOCK_Connector (void);

Default constructor.

    ACE_SOCK_Connector (
        ACE_SOCK_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 = 0,
        int perms = 0,
        int protocol_family = PF_INET,
        int protocol = 0
        );

Actively connect and produce a `new_stream` if things go well. The `remote_sap` is the address that we are trying to connect with. The `timeout` 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 amount of time to wait before timing out. If the time expires before the connection is made `errno == ETIME`. The `local_sap` 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 `reuse_addr` == 1 then the `local_addr` is reused, even if it hasn't been cleanedup yet.

    ACE_SOCK_Connector (
        ACE_SOCK_Stream &new_stream,
        const ACE_Addr &remote_sap,
        ACE_QoS_Params qos_params,
        ACE_Time_Value *timeout = 0,
        const ACE_Addr &local_sap = ACE_Addr::sap_any,
        ACE_Protocol_Info *protocolinfo = 0,
        ACE_SOCK_GROUP g = 0,
        u_long flags = 0,
        int reuse_addr = 0,
        int perms = 0,
        int protocol_family = PF_INET,
        int protocol = 0
        );

Actively connect and produce a `new_stream` if things go well. The `remote_sap` is the address that we are trying to connect with. The `qos_params` contains QoS parameters that are passed to the IntServ (RSVP) and DiffServ protocols. The `timeout` 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 amount of time to wait before timing out. If the time expires before the connection is made `errno == ETIME`. The `local_sap` 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 `reuse_addr` == 1 then the `local_addr` is reused, even if it hasn't been cleanedup yet.

    int connect (
        ACE_SOCK_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 = 0,
        int perms = 0,
        int protocol_family = PF_INET,
        int protocol = 0
        );

Actively connect and produce a `new_stream` if things go well. The `remote_sap` is the address that we are trying to connect with. The `timeout` 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 amount of time to wait before timing out. If the time expires before the connection is made `errno == ETIME`. The `local_sap` 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 `reuse_addr` == 1 then the `local_addr` is reused, even if it hasn't been cleanedup yet.

    int connect (
        ACE_SOCK_Stream &new_stream,
        const ACE_Addr &remote_sap,
        ACE_QoS_Params qos_params,
        ACE_Time_Value *timeout = 0,
        const ACE_Addr &local_sap = ACE_Addr::sap_any,
        ACE_Protocol_Info *protocolinfo = 0,
        ACE_SOCK_GROUP g = 0,
        u_long flags = 0,
        int reuse_addr = 0,
        int perms = 0,
        int protocol_family = PF_INET,
        int protocol = 0
        );

Actively connect and produce a `new_stream` if things go well. The `remote_sap` is the address that we are trying to connect with. The `qos_params` contains QoS parameters that are passed to the IntServ (RSVP) and DiffServ protocols. The `timeout` 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 amount of time to wait before timing out. If the time expires before the connection is made `errno == ETIME`. The `local_sap` 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 `reuse_addr` == 1 then the `local_addr` is reused, even if it hasn't been cleanedup yet.

    ~ACE_SOCK_Connector (void);

Default dtor.

## Completion routine.

    int complete (
        ACE_SOCK_Stream &new_stream,
        ACE_Addr *remote_sap = 0,
        ACE_Time_Value *timeout = 0
        );

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

    int reset_new_handle (ACE_HANDLE handle);

Resets any event associations on this handle

## Meta-type info

    typedef ACE_INET_Addr PEER_ADDR;

    typedef ACE_SOCK_Stream PEER_STREAM;

    void dump (void) const;

Dump the state of an object.

    ACE_ALLOC_HOOK_DECLARE;

Declare the dynamic allocation hooks.

## AUTHOR

Doug Schmidt

## LIBRARY

ace