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;
|
|
|
|
|
|
|
|
g_type_init ();
|
|
|
|
|
|
|
|
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 ();
|
|
|
|
}
|