From: Samuel Cormier-Iijima Date: Sun, 2 Mar 2008 08:20:39 +0000 (-0500) Subject: Async connecting *almost* works. For some reason the G_IO_OUT condition X-Git-Url: http://git.cascardo.info/?p=cascardo%2Fgnio.git;a=commitdiff_plain;h=d3b54ae185b239b4383729805f77cc96136924ac Async connecting *almost* works. For some reason the G_IO_OUT condition doesn't get noticed, not sure why... --- diff --git a/gnio/gtcpclient.c b/gnio/gtcpclient.c index c732a59..ca8b350 100644 --- a/gnio/gtcpclient.c +++ b/gnio/gtcpclient.c @@ -293,7 +293,7 @@ connect_callback (ConnectData *data, { result = g_simple_async_result_new (G_OBJECT (client), data->callback, data->user_data, g_tcp_client_connect_async); } - else if (condition & G_IO_ERR) + else { if (!g_socket_has_socket_error (client->priv->socket, &error)) g_warning ("got G_IO_ERR but socket does not have error"); @@ -308,6 +308,41 @@ connect_callback (ConnectData *data, return FALSE; } +static void +resolve_callback (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + ConnectData *data = (ConnectData *) user_data; + GInetAddress *address; + GSimpleAsyncResult *error_result; + GError *error = NULL; + + address = g_resolver_resolve_finish (G_RESOLVER (source), result, &error); + + g_object_unref (G_RESOLVER (source)); + + if (!address) + { + error_result = g_simple_async_result_new_from_error (G_OBJECT (data->client), data->callback, data->user_data, error); + + g_simple_async_result_complete (error_result); + + g_object_unref (error_result); + } + else + { + data->client->priv->address = g_inet_socket_address_new (address, data->client->priv->port); + + g_object_ref_sink (data->client->priv->address); + + // at this point, the address has been resolved, so connect_async again + g_tcp_client_connect_async (data->client, data->cancellable, data->callback, data->user_data); + } + + g_free (data); +} + void g_tcp_client_connect_async (GTcpClient *client, GCancellable *cancellable, @@ -325,7 +360,17 @@ g_tcp_client_connect_async (GTcpClient *client, if (!client->priv->address) { // we've been constructed with just hostname+port, resolve - // GResolver *resolver = g_resolver_new (); + GResolver *resolver = g_resolver_new (); + + data = g_new (ConnectData, 1); + + data->client = client; + data->callback = callback; + data->cancellable = cancellable; + data->user_data = user_data; + + g_resolver_resolve_async (resolver, client->priv->hostname, cancellable, resolve_callback, data); + return; } @@ -354,7 +399,7 @@ g_tcp_client_connect_async (GTcpClient *client, if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_PENDING)) { // the connection is in progress - source = g_socket_create_source (client->priv->socket, G_IO_OUT | G_IO_ERR, cancellable); + source = g_socket_create_source (client->priv->socket, G_IO_OUT | G_IO_ERR | G_IO_HUP, cancellable); data = g_new (ConnectData, 1); diff --git a/test/test-tcp-client.c b/test/test-tcp-client.c index 467d172..8620ba4 100644 --- a/test/test-tcp-client.c +++ b/test/test-tcp-client.c @@ -3,29 +3,28 @@ GMainLoop *loop; -/* -void -accept_callback (GSocket *socket, GAsyncResult *result, gpointer data) +static void +connect_callback (GObject *source, GAsyncResult *result, gpointer data) { + GTcpClient *client = G_TCP_CLIENT (source); GError *error = NULL; - if (!g_socket_connect_finish (socket, result, &error)) { + if (!g_tcp_client_connect_finish (client, result, &error)) { g_warning (error->message); return; } g_print ("successfully connected\n"); } -*/ int main (int argc, char *argv[]) { GTcpClient *client; - GInputStream *input; +/* GInputStream *input; GOutputStream *output; - GError *error = NULL; gchar buffer[512] = {0}; gssize count; + GError *error = NULL;*/ g_thread_init (NULL); @@ -33,10 +32,14 @@ int main (int argc, char *argv[]) loop = g_main_loop_new (NULL, FALSE); - client = g_tcp_client_new ("www.google.com", 80); + client = g_tcp_client_new ("localhost", 80); g_print ("connecting to www.google.com:80\n"); + g_tcp_client_connect_async (client, NULL, connect_callback, NULL); + + g_print ("connecting seems to have begun\n"); +/* if (!g_tcp_client_connect (client, NULL, &error)) { g_warning (error->message); return 1; @@ -65,8 +68,8 @@ int main (int argc, char *argv[]) g_print ("read %d bytes: %s\n", count, buffer); g_object_unref (G_OBJECT (client)); - -// g_main_loop_run (loop); +*/ + g_main_loop_run (loop); return 0; }