## GSocketConnectable GSocketConnectable — Interface for potential socket endpoints |

## Synopsis

                        GSocketConnectable;
                        GSocketConnectableIface;
    GSocketAddressEnumerator * g_socket_connectable_enumerate
                                                            (GSocketConnectable *connectable);

                        GSocketAddressEnumerator;
    GSocketAddress *    g_socket_address_enumerator_next    (GSocketAddressEnumerator *enumerator,
                                                             GCancellable *cancellable,
                                                             GError **error);
    void                g_socket_address_enumerator_next_async
                                                            (GSocketAddressEnumerator *enumerator,
                                                             GCancellable *cancellable,
                                                             GAsyncReadyCallback callback,
                                                             gpointer user_data);
    GSocketAddress *    g_socket_address_enumerator_next_finish
                                                            (GSocketAddressEnumerator *enumerator,
                                                             GAsyncResult *result,
                                                             GError **error);

## Object Hierarchy

      GInterface
       +----GSocketConnectable

      GObject
       +----GSocketAddressEnumerator

## Prerequisites

GSocketConnectable requires GObject.

## Known Implementations

GSocketConnectable is implemented by GInetSocketAddress, GNetworkAddress, GNetworkService, GSocketAddress and GUnixSocketAddress.

## Description

Objects that describe one or more potential socket endpoints implement GSocketConnectable. Callers can then use `g_socket_connectable_enumerate()` to get a GSocketAddressEnumerator to try out each socket address in turn until one succeeds, as shown in the sample code below.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    MyConnectionType *
    connect_to_host (const char    *hostname,
                     guint16        port,
                     GCancellable  *cancellable,
                     GError       **error)
    {
      MyConnection *conn = NULL;
      GSocketConnectable *addr;
      GSocketAddressEnumerator *enumerator;
      GSocketAddress *sockaddr;
      GError *conn_error = NULL;

      addr = g_network_address_new ("www.gnome.org", 80);
      enumerator = g_socket_connectable_enumerate (addr);
      g_object_unref (addr);

      /* Try each sockaddr until we succeed. Record the first
       * connection error, but not any further ones (since they'll probably
       * be basically the same as the first).
       */
      while (!conn && (sockaddr = g_socket_address_enumerator_next (enumerator, cancellable, error))
        {
          conn = connect_to_sockaddr (sockaddr, conn_error ? NULL : &conn_error);
          g_object_unref (sockaddr);
        }
      g_object_unref (enumerator);

      if (conn)
        {
          if (conn_error)
            {
              /* We couldn't connect to the first address, but we succeeded
               * in connecting to a later address.
               */
              g_error_free (conn_error);
            }
          return conn;
        }
      else if (error)
        {
          /* Either the initial lookup failed, or else the caller
           * cancelled us.
           */
          if (conn_error)
            g_error_free (conn_error);
          return NULL;
        }
      else
        {
          g_error_propagate (error, conn_error);
          return NULL;
        }
    }

## Details

### GSocketConnectable

    typedef struct _GSocketConnectable GSocketConnectable;

Interface for objects that contain or generate GSocketAddresses.

### GSocketConnectableIface

    typedef struct {
      GTypeInterface g_iface;

      /* Virtual Table */

      GSocketAddressEnumerator * (* enumerate) (GSocketConnectable *connectable);
    } GSocketConnectableIface;

Provides an interface for returning a GSocketAddressEnumerator

GTypeInterface `g_iface`; | The parent interface.
`enumerate` () | Creates a GSocketAddressEnumerator

### g_socket_connectable_enumerate ()

    GSocketAddressEnumerator * g_socket_connectable_enumerate
                                                            (GSocketConnectable *connectable);

Creates a GSocketAddressEnumerator for `connectable`.

`connectable` : | a GSocketConnectable
Returns : | a new GSocketAddressEnumerator.

Since 2.22

### GSocketAddressEnumerator

    typedef struct _GSocketAddressEnumerator GSocketAddressEnumerator;

Enumerator type for objects that contain or generate GSocketAddresses.

### g_socket_address_enumerator_next ()

    GSocketAddress *    g_socket_address_enumerator_next    (GSocketAddressEnumerator *enumerator,
                                                             GCancellable *cancellable,
                                                             GError **error);

Retrieves the next GSocketAddress from `enumerator`. Note that this may block for some amount of time. (Eg, a GNetworkAddress may need to do a DNS lookup before it can return an address.) Use `g_socket_address_enumerator_next_async()` if you need to avoid blocking.

If `enumerator` is expected to yield addresses, but for some reason is unable to (eg, because of a DNS error), then the first call to `g_socket_address_enumerator_next()` will return an appropriate error in *`error`. However, if the first call to `g_socket_address_enumerator_next()` succeeds, then any further internal errors (other than `cancellable` being triggered) will be ignored.

`enumerator` : | a GSocketAddressEnumerator
`cancellable` : | optional GCancellable object, `NULL` to ignore.
`error` : | a GError.
Returns : | a GSocketAddress (owned by the caller), or `NULL` on error (in which case *`error` will be set) or if there are no more addresses.

### g_socket_address_enumerator_next_async ()

    void                g_socket_address_enumerator_next_async
                                                            (GSocketAddressEnumerator *enumerator,
                                                             GCancellable *cancellable,
                                                             GAsyncReadyCallback callback,
                                                             gpointer user_data);

Asynchronously retrieves the next GSocketAddress from `enumerator` and then calls `callback`, which must call `g_socket_address_enumerator_next_finish()` to get the result.

`enumerator` : | a GSocketAddressEnumerator
`cancellable` : | optional GCancellable object, `NULL` to ignore.
`callback` : | a GAsyncReadyCallback to call when the request is satisfied
`user_data` : | the data to pass to callback function

### g_socket_address_enumerator_next_finish ()

    GSocketAddress *    g_socket_address_enumerator_next_finish
                                                            (GSocketAddressEnumerator *enumerator,
                                                             GAsyncResult *result,
                                                             GError **error);

Retrieves the result of a completed call to `g_socket_address_enumerator_next_async()`. See `g_socket_address_enumerator_next()` for more information about error handling.

`enumerator` : | a GSocketAddressEnumerator
`result` : | a GAsyncResult
`error` : | a GError
Returns : | a GSocketAddress (owned by the caller), or `NULL` on error (in which case *`error` will be set) or if there are no more addresses.