+ GInetAddress *address;
+
+ g_return_val_if_fail (G_IS_TCP_CLIENT (client), FALSE);
+
+ if (!client->priv->address)
+ {
+ // we've been constructed with just hostname+port, resolve
+ GResolver *resolver = g_resolver_new ();
+
+ address = g_resolver_resolve (resolver, client->priv->hostname, cancellable, error);
+
+ if (!address)
+ return FALSE;
+
+ client->priv->address = g_inet_socket_address_new (address, client->priv->port);
+
+ g_object_unref (resolver);
+
+ g_object_ref_sink (client->priv->address);
+ }
+ else
+ {
+ address = g_inet_socket_address_get_address (client->priv->address);
+ }
+
+ if (G_IS_INET4_ADDRESS (address))
+ client->priv->socket = g_socket_new (G_SOCKET_DOMAIN_INET, G_SOCKET_TYPE_STREAM, NULL, error);
+ else if (G_IS_INET6_ADDRESS (address))
+ client->priv->socket = g_socket_new (G_SOCKET_DOMAIN_INET6, G_SOCKET_TYPE_STREAM, NULL, error);
+ else
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, "unsupported address domain");
+ return FALSE;
+ }
+
+ if (!client->priv->socket)
+ return FALSE;
+
+ if (g_cancellable_set_error_if_cancelled (cancellable, error))
+ return FALSE;
+
+ if (!g_socket_connect (client->priv->socket, G_SOCKET_ADDRESS (client->priv->address), error))
+ return FALSE;
+
+ return TRUE;