[glib] Add send-data, a g_socket_client test case



commit fdfdec36d0d0044513db25872132bd42d392f748
Author: Alexander Larsson <alexl redhat com>
Date:   Tue May 19 13:44:11 2009 +0200

    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 deletions(-)

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 <gio/gio.h>
+#include <string.h>
+#include <stdio.h>
+
+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 (" <hostname>[: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;
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]