#include "server_communication.h" #include #include static GSocket *server_connect(struct server *server) { GError *error = NULL, *conn_error = NULL; GSocketConnectable *addr; GSocketAddressEnumerator *enumerator; GSocketAddress *sockaddr; GSocketConnection *conn = NULL; GSocketClient *client; 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_connect: no connectable addresses found for host %s", server->host); } return NULL; } if(conn == NULL) { g_warning(conn_error->message); g_error_free(conn_error); return NULL; } GSocket *socket = g_socket_connection_get_socket(conn); g_debug("connected"); return socket; } gboolean server_ping(struct server *server) { GTimer *timer = g_timer_new(); GSocket *socket = server_connect(server); if(socket == NULL) { return FALSE; } gboolean result = FALSE; g_socket_send(socket, "ping\n", 5, NULL, NULL); gchar buffer[0x400]; gssize size = g_socket_receive(socket, buffer, 0x400, NULL, NULL); if(size == 5 && strncmp(buffer, "pong", 4) == 0) { g_debug("ping response: %f ms", g_timer_elapsed(timer, NULL) * 1000); result = TRUE; } g_timer_destroy(timer); g_socket_close(socket, NULL); return result; } GSList *server_find(struct server *server, const gchar *type, const gchar *str) { GSocket *socket = server_connect(server); if(socket == NULL) { return NULL; } gchar buffer[0x400]; g_snprintf(buffer, 0x400, "find %s %s\nexit\n", type, str); g_socket_send(socket, buffer, strlen(buffer), NULL, NULL); GSList *list = NULL; gssize size; while((size = g_socket_receive(socket, buffer, 0x400, NULL, NULL)) > 0) { if(buffer[size - 1] == '\n') { buffer[size - 1] = '\0'; } g_debug("got %s", buffer); } g_debug("closed: %d", size); g_socket_close(socket, NULL); return NULL; }