| #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}, | |
| G_OPTION_ENTRY_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; | |
| } | |
| service = g_threaded_socket_service_new (10); | |
| 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 (); | |
| } |