| 
									
										
										
										
											2009-05-15 21:34:14 +02:00
										 |  |  | #include <gio/gio.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define MESSAGE "Welcome to the echo service!\n"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int port = 7777; | 
					
						
							|  |  |  | static GOptionEntry cmd_entries[] = { | 
					
						
							|  |  |  |   {"port", 'p', 0, G_OPTION_ARG_INT, &port, | 
					
						
							|  |  |  |    "Local port to bind to", NULL}, | 
					
						
							|  |  |  |   {NULL} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static gboolean | 
					
						
							|  |  |  | handler (GThreadedSocketService *service, | 
					
						
							|  |  |  |          GSocketConnection      *connection, | 
					
						
							|  |  |  |          GSocketListener        *listener, | 
					
						
							|  |  |  |          gpointer                user_data) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GOutputStream *out; | 
					
						
							|  |  |  |   GInputStream *in; | 
					
						
							|  |  |  |   char buffer[1024]; | 
					
						
							|  |  |  |   gssize size; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   out = g_io_stream_get_output_stream (G_IO_STREAM (connection)); | 
					
						
							|  |  |  |   in = g_io_stream_get_input_stream (G_IO_STREAM (connection)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_output_stream_write_all (out, MESSAGE, strlen (MESSAGE), | 
					
						
							|  |  |  |                              NULL, NULL, NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   while (0 < (size = g_input_stream_read (in, buffer, | 
					
						
							|  |  |  |                                           sizeof buffer, NULL, NULL))) | 
					
						
							|  |  |  |     g_output_stream_write (out, buffer, size, NULL, NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | main (int argc, char *argv[]) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GSocketService *service; | 
					
						
							|  |  |  |   GOptionContext *context; | 
					
						
							|  |  |  |   GError *error = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   context = g_option_context_new (" - Test GSocket server stuff"); | 
					
						
							|  |  |  |   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; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-18 08:47:10 +02:00
										 |  |  |   service = g_threaded_socket_service_new (10); | 
					
						
							| 
									
										
										
										
											2009-05-15 21:34:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (!g_socket_listener_add_inet_port (G_SOCKET_LISTENER (service), | 
					
						
							|  |  |  | 					port, | 
					
						
							|  |  |  | 					NULL, | 
					
						
							|  |  |  | 					&error)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       g_printerr ("%s: %s\n", argv[0], error->message); | 
					
						
							|  |  |  |       return 1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_print ("Echo service listening on port %d\n", port); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_signal_connect (service, "run", G_CALLBACK (handler), NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_main_loop_run (g_main_loop_new (NULL, FALSE)); | 
					
						
							|  |  |  |   g_assert_not_reached (); | 
					
						
							|  |  |  | } |