Basic server listening loop.
This commit is contained in:
@@ -21,8 +21,8 @@ RM := rm -f
|
|||||||
|
|
||||||
DEBUG ?= 1
|
DEBUG ?= 1
|
||||||
|
|
||||||
COMMON_CFLAGS := -std=$(STD) -Werror -Wextra -Wall -MMD -MP -I$(SRC_DIR) `pkg-config --cflags glib-2.0`
|
COMMON_CFLAGS := -std=$(STD) -Werror -Wextra -Wall -MMD -MP -I$(SRC_DIR) `pkg-config --cflags glib-2.0 gio-2.0`
|
||||||
COMMON_LDFLAGS := -std=$(STD) -lm `pkg-config --libs glib-2.0 sdl3 sdl3-image`
|
COMMON_LDFLAGS := -std=$(STD) -lm `pkg-config --libs glib-2.0 gio-2.0 sdl3 sdl3-image`
|
||||||
|
|
||||||
ifeq ($(DEBUG),1)
|
ifeq ($(DEBUG),1)
|
||||||
COMMON_CFLAGS += -g -DDEBUG
|
COMMON_CFLAGS += -g -DDEBUG
|
||||||
|
|||||||
@@ -9,6 +9,8 @@
|
|||||||
#define UNUSED_2(arg, ...) (void) arg, UNUSED_3 (__VA_ARGS__, 0)
|
#define UNUSED_2(arg, ...) (void) arg, UNUSED_3 (__VA_ARGS__, 0)
|
||||||
#define UNUSED_3(arg, ...) (void) arg
|
#define UNUSED_3(arg, ...) (void) arg
|
||||||
|
|
||||||
|
#define SERVER_DEFAULT_PORT 33666
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
GLib log levels:
|
GLib log levels:
|
||||||
|
|||||||
+107
-1
@@ -1,8 +1,114 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <common/util.h>
|
||||||
|
#include <glib.h>
|
||||||
|
#include <gio/gio.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
main ()
|
main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
setenv ("G_MESSAGES_DEBUG", "all", 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
GError *error = NULL;
|
||||||
|
int PORT = SERVER_DEFAULT_PORT;
|
||||||
|
if (argc > 1)
|
||||||
|
{
|
||||||
|
PORT = atoi (argv[1]);
|
||||||
|
g_info ("Changed the listening port from default=%d to custom=%d",
|
||||||
|
SERVER_DEFAULT_PORT, PORT);
|
||||||
|
}
|
||||||
|
GSocket *socket = g_socket_new (G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_STREAM,
|
||||||
|
G_SOCKET_PROTOCOL_TCP, &error);
|
||||||
|
if (!socket)
|
||||||
|
{
|
||||||
|
g_printerr ("Socket creation failed: %s\n", error->message);
|
||||||
|
g_clear_error (&error);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_info ("Created TCP socket.");
|
||||||
|
}
|
||||||
|
|
||||||
|
GInetAddress *addr = g_inet_address_new_any (G_SOCKET_FAMILY_IPV4);
|
||||||
|
GSocketAddress *sockaddr = g_inet_socket_address_new (addr, PORT);
|
||||||
|
|
||||||
|
if (!g_socket_bind (socket, sockaddr, TRUE, &error))
|
||||||
|
{
|
||||||
|
g_printerr ("Bind failed: %s\n", error->message);
|
||||||
|
g_clear_error (&error);
|
||||||
|
g_object_unref (socket);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_info ("Bound TCP socket to port %d", PORT);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_object_unref (addr);
|
||||||
|
g_object_unref (sockaddr);
|
||||||
|
|
||||||
|
if (!g_socket_listen (socket, &error))
|
||||||
|
{
|
||||||
|
g_printerr ("Listen failed: %s\n", error->message);
|
||||||
|
g_clear_error (&error);
|
||||||
|
g_object_unref (socket);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_info ("TCP socket is now listening");
|
||||||
|
}
|
||||||
|
|
||||||
|
g_info ("Listening...");
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
GSocket *socket2 = g_socket_accept (socket, NULL, &error);
|
||||||
|
GSocketConnection *connection =
|
||||||
|
g_socket_connection_factory_create_connection (socket2);
|
||||||
|
if (!connection)
|
||||||
|
{
|
||||||
|
g_printerr ("accept() failed: %s\n", error->message);
|
||||||
|
g_clear_error (&error);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_info ("New connection accepted");
|
||||||
|
}
|
||||||
|
|
||||||
|
GInputStream *istream =
|
||||||
|
g_io_stream_get_input_stream (G_IO_STREAM (connection));
|
||||||
|
gchar buffer[1024];
|
||||||
|
gssize n =
|
||||||
|
g_input_stream_read (istream, buffer, sizeof (buffer) - 1, NULL,
|
||||||
|
&error);
|
||||||
|
|
||||||
|
if (n > 0)
|
||||||
|
{
|
||||||
|
buffer[n] = '\0';
|
||||||
|
g_print ("Received from client: %s\n", buffer);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_printerr ("Read error: %s\n", error->message);
|
||||||
|
g_clear_error (&error);
|
||||||
|
}
|
||||||
|
|
||||||
|
GOutputStream *ostream =
|
||||||
|
g_io_stream_get_output_stream (G_IO_STREAM (connection));
|
||||||
|
const gchar *response =
|
||||||
|
"Hello from the librefront server. Not implemented!!";
|
||||||
|
g_output_stream_write (ostream, response, strlen (response), NULL,
|
||||||
|
&error);
|
||||||
|
g_output_stream_flush (ostream, NULL, &error);
|
||||||
|
|
||||||
|
g_io_stream_close (G_IO_STREAM (connection), NULL, NULL);
|
||||||
|
g_object_unref (connection);
|
||||||
|
g_object_unref (socket2);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_object_unref (socket);
|
||||||
fprintf (stderr, "Server not implemented!\n");
|
fprintf (stderr, "Server not implemented!\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user