diff options
-rw-r--r-- | communication_source.c | 1 | ||||
-rw-r--r-- | server_communication.c | 61 | ||||
-rw-r--r-- | server_communication.h | 10 | ||||
-rw-r--r-- | servers.c | 46 |
4 files changed, 72 insertions, 46 deletions
diff --git a/communication_source.c b/communication_source.c index b0a03cb..d2e7179 100644 --- a/communication_source.c +++ b/communication_source.c @@ -1,5 +1,6 @@ #include "communication_source.h" #include "servers.h" +#include "server_communication.h" static GQueue *jobqueue = NULL; 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; +} + diff --git a/server_communication.h b/server_communication.h new file mode 100644 index 0000000..17c1b89 --- /dev/null +++ b/server_communication.h @@ -0,0 +1,10 @@ +#ifndef SERVER_COMMUNICATION_H +#define SERVER_COMMUNICATION_H + +#include "servers.h" + +#include <glib.h> + +gboolean server_sync(struct server *server); + +#endif @@ -5,52 +5,6 @@ GSList *servers = NULL; -gboolean server_sync(struct server *server) { - GError *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, &error); - g_object_unref(sockaddr); - } - - if(conn == NULL) { - g_warning(error->message); - g_error_free(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; -} - gboolean server_add(const gchar *host, const guint16 port) { struct server *server = g_new0(struct server, 1); |