From: Samuel Cormier-Iijima Date: Wed, 27 Feb 2008 05:08:58 +0000 (-0500) Subject: Asynchronous accepts now work, the rest should go smoothly :-) X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fgnio.git;a=commitdiff_plain;h=48a0aacfab0849470c4bc44c0656753ab29d91aa Asynchronous accepts now work, the rest should go smoothly :-) --- diff --git a/gnio/gsocket.c b/gnio/gsocket.c index 9a61e11..f6c586e 100644 --- a/gnio/gsocket.c +++ b/gnio/gsocket.c @@ -194,7 +194,7 @@ g_socket_set_blocking (GSocket *socket, if ((arg = fcntl (socket->priv->fd, F_GETFL, NULL)) < 0) g_warning ("Error getting socket status flags: %s", g_strerror (errno)); - arg = blocking ? arg | O_NONBLOCK : arg & ~O_NONBLOCK; + arg = blocking ? arg & ~O_NONBLOCK : arg | O_NONBLOCK; if (fcntl (socket->priv->fd, F_SETFL, arg) < 0) g_warning ("Error setting socket status flags: %s", g_strerror (errno)); @@ -299,9 +299,30 @@ accept_callback (AcceptData *data, GIOCondition condition, gint fd) { + GSocket *socket; + GSimpleAsyncResult *result; + gint ret; + + socket = data->socket; + if (condition & G_IO_IN) { - g_print ("WE COULD ACCEPT HERE\n"); + if ((ret = accept (socket->priv->fd, NULL, 0)) < 0) + { + if (errno == EAGAIN) + return TRUE; + + result = g_simple_async_result_new_error (G_OBJECT (socket), data->callback, data->user_data, G_IO_ERROR, g_io_error_from_errno (errno), "error accepting connection"); + } + else + { + result = g_simple_async_result_new (G_OBJECT (socket), data->callback, data->user_data, g_socket_accept_async); + + g_simple_async_result_set_op_res_gpointer (result, g_socket_new_from_fd (ret), g_object_unref); + } + g_simple_async_result_complete (result); + + g_object_unref (result); } return FALSE; @@ -360,7 +381,18 @@ g_socket_accept_finish (GSocket *socket, GAsyncResult *result, GError **error) { - return NULL; + GSocket *new_socket; + GSimpleAsyncResult *simple; + + g_return_val_if_fail (G_IS_SOCKET (socket), NULL); + + simple = G_SIMPLE_ASYNC_RESULT (result); + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_socket_accept_async); + + new_socket = g_object_ref (g_simple_async_result_get_op_res_gpointer (simple)); + + return new_socket; } gboolean diff --git a/test/test-server.c b/test/test-server.c index 7507a98..9a7c9d6 100644 --- a/test/test-server.c +++ b/test/test-server.c @@ -8,10 +8,24 @@ GMainLoop *loop; -int main (int argc, char *argv[]) +void +accept_callback (GSocket *socket, GAsyncResult *result, gpointer data) { - GSocket *socket, *new_socket; + GSocket *new_socket; GSocketAddress *address; + GError *error = NULL; + + new_socket = g_socket_accept_finish (socket, result, &error); + + address = g_socket_get_peer_address (new_socket, NULL); + + g_printf ("got a new connection from %s:%d\n", g_inet_address_to_string (g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address))), g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address))); + +} + +int main (int argc, char *argv[]) +{ + GSocket *socket; g_thread_init (NULL); @@ -27,13 +41,9 @@ int main (int argc, char *argv[]) g_printf ("listening on port 31882...\n"); - new_socket = g_socket_accept (socket, NULL, NULL); - - address = g_socket_get_peer_address (new_socket, NULL); - - g_printf ("got a new connection from %s:%d\n", g_inet_address_to_string (g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address))), g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address))); + g_socket_accept_async (socket, NULL, (GAsyncReadyCallback) accept_callback, NULL); -// g_main_loop_run (loop); + g_main_loop_run (loop); return 0; }