diff options
Diffstat (limited to 'server_communication.c')
-rw-r--r-- | server_communication.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/server_communication.c b/server_communication.c new file mode 100644 index 0000000..227eb8f --- /dev/null +++ b/server_communication.c @@ -0,0 +1,61 @@ +#include "server_communication.h" + +#include <gio/gio.h> + +gboolean server_sync(struct server *server) { + GError *error = NULL, *conn_error = NULL; + GSocketConnectable *addr; + GSocketAddressEnumerator *enumerator; + GSocketAddress *sockaddr; + GSocketConnection *conn = NULL; + GSocketClient *client; + GTimer *timer = g_timer_new(); + + addr = g_network_address_new(server->host, server->port); + enumerator = g_socket_connectable_enumerate(addr); + g_object_unref(addr); + + client = g_socket_client_new(); + + while(conn == NULL && (sockaddr = g_socket_address_enumerator_next(enumerator, NULL, &error))) { + conn = g_socket_client_connect(client, (GSocketConnectable*)sockaddr, NULL, &conn_error); + g_object_unref(sockaddr); + } + + if(sockaddr == NULL) { + if(error != NULL) { + g_warning(error->message); + g_error_free(error); + } else { + g_warning("server_sync: no connectable addresses found for host %s", + server->host); + } + return FALSE; + } + + if(conn == NULL) { + g_warning(conn_error->message); + g_error_free(conn_error); + return FALSE; + } + + GSocket *socket = g_socket_connection_get_socket(conn); + + g_debug("connected"); + + g_socket_send(socket, "ping\n", 5, NULL, NULL); + gchar buffer[0x400]; + g_socket_receive(socket, buffer, 0x400, NULL, NULL); + if(buffer[4] == '\n') { + buffer[4] = '\0'; + g_debug("got response: %s", buffer); + g_debug("time: %f ms", g_timer_elapsed(timer, NULL) * 1000); + } + + g_timer_destroy(timer); + + g_socket_close(socket, NULL); + + return TRUE; +} + |