|  |  |  | GIO Reference Manual |  | 
|---|---|---|---|---|
| Top | Description | Object Hierarchy | Prerequisites | Known Implementations | ||||
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);
GSocketConnectable is implemented by GInetSocketAddress, GNetworkAddress, GNetworkService, GSocketAddress and GUnixSocketAddress.
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.
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;
    }
}
typedef struct _GSocketConnectable GSocketConnectable;
Interface for objects that contain or generate GSocketAddresses.
typedef struct {
  GTypeInterface g_iface;
  /* Virtual Table */
  GSocketAddressEnumerator * (* enumerate) (GSocketConnectable *connectable);
} GSocketConnectableIface;
Provides an interface for returning a GSocketAddressEnumerator
| GTypeInterface  | The parent interface. | 
| Creates a GSocketAddressEnumerator | 
GSocketAddressEnumerator * g_socket_connectable_enumerate
                                                        (GSocketConnectable *connectable);
Creates a GSocketAddressEnumerator for connectable.
| 
 | a GSocketConnectable | 
| Returns : | a new GSocketAddressEnumerator. | 
Since 2.22
typedef struct _GSocketAddressEnumerator GSocketAddressEnumerator;
Enumerator type for objects that contain or generate GSocketAddresses.
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.
| 
 | a GSocketAddressEnumerator | 
| 
 | optional GCancellable object, NULLto ignore. | 
| 
 | a GError. | 
| Returns : | a GSocketAddress (owned by the caller), or NULLon
    error (in which case *errorwill be set) or if there are no
    more addresses. | 
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.
| 
 | a GSocketAddressEnumerator | 
| 
 | optional GCancellable object, NULLto ignore. | 
| 
 | a GAsyncReadyCallback to call when the request is satisfied | 
| 
 | the data to pass to callback function | 
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.
| 
 | a GSocketAddressEnumerator | 
| 
 | a GAsyncResult | 
| 
 | a GError | 
| Returns : | a GSocketAddress (owned by the caller), or NULLon
    error (in which case *errorwill be set) or if there are no
    more addresses. |