From fdfdec36d0d0044513db25872132bd42d392f748 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Tue, 19 May 2009 13:44:11 +0200 Subject: [PATCH] Add send-data, a g_socket_client test case --- gio/tests/Makefile.am | 6 ++- gio/tests/send-data.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 gio/tests/send-data.c diff --git a/gio/tests/Makefile.am b/gio/tests/Makefile.am index 7a20869..46b9fa6 100644 --- a/gio/tests/Makefile.am +++ b/gio/tests/Makefile.am @@ -30,7 +30,7 @@ TEST_PROGS += \ filter-streams \ simple-async-result -SAMPLE_PROGS = resolver socket-server socket-client echo-server httpd +SAMPLE_PROGS = resolver socket-server socket-client echo-server httpd send-data if OS_UNIX TEST_PROGS += live-g-file unix-streams desktop-app-info @@ -102,4 +102,8 @@ httpd_SOURCES = httpd.c httpd_LDADD = $(progs_ldadd) \ $(top_builddir)/gthread/libgthread-2.0.la +send_data_SOURCES = send-data.c +send_data_LDADD = $(progs_ldadd) \ + $(top_builddir)/gthread/libgthread-2.0.la + DISTCLEAN_FILES = applications/mimeinfo.cache diff --git a/gio/tests/send-data.c b/gio/tests/send-data.c new file mode 100644 index 0000000..41eed5f --- /dev/null +++ b/gio/tests/send-data.c @@ -0,0 +1,120 @@ +#include +#include +#include + +int cancel_timeout = 0; +static GOptionEntry cmd_entries[] = { + {"cancel", 'c', 0, G_OPTION_ARG_INT, &cancel_timeout, + "Cancel any op after the specified amount of seconds", NULL}, + {NULL} +}; + +static gpointer +cancel_thread (gpointer data) +{ + GCancellable *cancellable = data; + + g_usleep (1000*1000*cancel_timeout); + g_print ("Cancelling\n"); + g_cancellable_cancel (cancellable); + return NULL; +} + +static char * +socket_address_to_string (GSocketAddress *address) +{ + GInetAddress *inet_address; + char *str, *res; + int port; + + inet_address = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address)); + str = g_inet_address_to_string (inet_address); + port = g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address)); + res = g_strdup_printf ("%s:%d", str, port); + g_free (str); + return res; +} + +int +main (int argc, char *argv[]) +{ + GOptionContext *context; + GSocketClient *client; + GSocketConnection *connection; + GSocketAddress *address; + GCancellable *cancellable; + GOutputStream *out; + GError *error = NULL; + char buffer[1000]; + + g_type_init (); + g_thread_init (NULL); + + context = g_option_context_new (" [:port] - send data to tcp host"); + g_option_context_add_main_entries (context, cmd_entries, NULL); + if (!g_option_context_parse (context, &argc, &argv, &error)) + { + g_printerr ("%s: %s\n", argv[0], error->message); + return 1; + } + + if (argc != 2) + { + g_printerr ("%s: %s\n", argv[0], "Need to specify hostname"); + return 1; + } + + if (cancel_timeout) + { + cancellable = g_cancellable_new (); + g_thread_create (cancel_thread, cancellable, FALSE, NULL); + } + else + { + cancellable = NULL; + } + + client = g_socket_client_new (); + connection = g_socket_client_connect_to_host (client, + argv[1], + 7777, + cancellable, &error); + if (connection == NULL) + { + g_printerr ("%s can't connect: %s\n", argv[0], error->message); + return 1; + } + + address = g_socket_connection_get_remote_address (connection, &error); + if (!address) + { + g_printerr ("Error getting remote address: %s\n", + error->message); + return 1; + } + g_print ("Connected to address: %s\n", + socket_address_to_string (address)); + g_object_unref (address); + + out = g_io_stream_get_output_stream (G_IO_STREAM (connection)); + + while (fgets(buffer, sizeof (buffer), stdin) != NULL) + { + if (!g_output_stream_write_all (out, buffer, strlen (buffer), + NULL, cancellable, &error)) + { + g_warning ("send error: %s\n", error->message); + g_error_free (error); + error = NULL; + } + } + + g_print ("closing stream\n"); + if (!g_io_stream_close (G_IO_STREAM (connection), cancellable, &error)) + { + g_warning ("close error: %s\n", error->message); + return 1; + } + + return 0; +} -- 2.7.4