separated server and client module

Mon, 17 Mar 2014 15:39:36 +0100

author
Mike Becker <universe@uap-core.de>
date
Mon, 17 Mar 2014 15:39:36 +0100
changeset 5
f7dfef88947d
parent 4
560e07f7a6a1
child 6
daaf6e5b3501

separated server and client module

src/Makefile file | annotate | diff | comparison | revisions
src/client.c file | annotate | diff | comparison | revisions
src/main.c file | annotate | diff | comparison | revisions
src/server.c file | annotate | diff | comparison | revisions
src/terminal-chess.h file | annotate | diff | comparison | revisions
--- a/src/Makefile	Mon Mar 17 14:35:53 2014 +0100
+++ b/src/Makefile	Mon Mar 17 15:39:36 2014 +0100
@@ -31,6 +31,8 @@
 SRC  = main.c
 SRC += network.c
 SRC += input.c
+SRC += server.c
+SRC += client.c
 
 OBJ = $(SRC:%.c=../build/%$(OBJ_EXT))
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/client.c	Mon Mar 17 15:39:36 2014 +0100
@@ -0,0 +1,83 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2014 Mike Becker. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "terminal-chess.h"
+#include "input.h"
+#include <ncurses.h>
+
+int client_run(Settings *settings) {
+    Server server;
+    int exit_code = EXIT_SUCCESS;
+
+    if (net_find(&server, settings->serverhost, settings->port)) {
+        fprintf(stderr, "Can't find server\n");
+        exit_code = EXIT_FAILURE;
+        goto quit;
+    }
+
+    if (net_connect(&server)) {
+        perror("Can't connect to server");
+        exit_code = EXIT_FAILURE;
+        goto quit;
+    }
+
+    /* net version handshake */
+    int fd = server.fd;
+    if (net_recieve_code(fd) != NETCODE_VERSION) {
+        fprintf(stderr, "Server uses an incompatible software version.\n");
+        exit_code = EXIT_FAILURE;
+        goto quit;
+    } else {
+        net_send_code(fd, NETCODE_VERSION);
+    }
+
+    printw("Connection established!\n\n");
+    refresh();
+
+    if (net_recieve_code(fd) == NETCODE_GAMEINFO) {
+        net_recieve_data(fd, &(settings->gameinfo),
+            sizeof(settings->gameinfo));
+        dump_gameinfo(&(settings->gameinfo));
+        printw("Accept challenge (y/n)? ");
+        if (prompt_yesno()) {
+            net_send_code(fd, NETCODE_ACCEPT);
+            // TODO: start game
+        } else {
+            net_send_code(fd, NETCODE_DECLINE);
+        }
+    } else {
+        fprintf(stderr, "Server sent invalid gameinfo.\n");
+        exit_code = EXIT_FAILURE;
+        goto quit;
+    }
+    
+quit:
+    net_destroy(&server);
+    return exit_code;
+}
--- a/src/main.c	Mon Mar 17 14:35:53 2014 +0100
+++ b/src/main.c	Mon Mar 17 15:39:36 2014 +0100
@@ -31,7 +31,6 @@
 #include <string.h>
 #include <time.h>
 #include <ncurses.h>
-#include "input.h"
 
 int get_settings(int argc, char **argv, Settings *settings) {
     char *valid;
@@ -126,17 +125,6 @@
     refresh();
 }
 
-int cleanup(Settings *settings, int exitcode) {
-
-    if (settings->server) {
-        if (net_destroy(settings->server)) {
-            perror("Server shutdown failed");
-        }
-    }
-    
-    return exitcode;
-}
-
 static WINDOW* window;
 
 void leavescr() {
@@ -179,88 +167,6 @@
     cbreak();
     atexit(leavescr);
     
-    Server server;
-    settings.server = &server;
-    
-    if (is_server(&settings)) {
-        dump_gameinfo(&(settings.gameinfo));
-        printw("\nListening for client...\n");
-        refresh();
-        if (net_create(&server, settings.port)) {
-            perror("Server creation failed");
-            return cleanup(&settings, EXIT_FAILURE);
-        }
-        
-        if (net_listen(&server)) {
-            perror("Listening for client failed");
-            return cleanup(&settings, EXIT_FAILURE);
-        }
-        
-        /* net version handshake */
-        int fd = server.client->fd;
-        net_send_code(fd, NETCODE_VERSION);
-        if (net_recieve_code(fd) != NETCODE_VERSION) {
-            fprintf(stderr, "Client uses an incompatible software version.\n");
-            return cleanup(&settings, EXIT_FAILURE);
-        }
-        
-        printw("Client connected - transmitting gameinfo...");
-        refresh();
-        
-        
-        net_send_code(fd, NETCODE_GAMEINFO);
-        net_send_data(fd, &(settings.gameinfo), sizeof(settings.gameinfo));
-        printw("\rClient connected - awaiting challenge acceptance...");
-        refresh();
-        int code = net_recieve_code(fd);
-        if (code == NETCODE_ACCEPT) {
-            printw("\rClient connected - challenge accepted.");
-            clrtoeol();
-        } else if (code == NETCODE_DECLINE) {
-            printw("\rClient connected - challenge declined.");
-            clrtoeol();
-        } else {
-            fprintf(stderr, "Invalid client response\n");
-            return cleanup(&settings, EXIT_FAILURE);
-        }
-    } else {
-        if (net_find(&server, settings.serverhost, settings.port)) {
-            fprintf(stderr, "Can't find server\n");
-            return cleanup(&settings, EXIT_FAILURE);
-        }
-        
-        if (net_connect(&server)) {
-            perror("Can't connect to server");
-            return cleanup(&settings, EXIT_FAILURE);
-        }
-        
-        int fd = server.fd;
-        if (net_recieve_code(fd) != NETCODE_VERSION) {
-            fprintf(stderr, "Server uses an incompatible software version.\n");
-            return cleanup(&settings, EXIT_FAILURE);
-        } else {
-            net_send_code(fd, NETCODE_VERSION);
-        }
-
-        printw("Connection established!\n\n");
-        refresh();
-        
-        if (net_recieve_code(fd) == NETCODE_GAMEINFO) {
-            net_recieve_data(fd, &(settings.gameinfo),
-                sizeof(settings.gameinfo));
-            dump_gameinfo(&(settings.gameinfo));
-            printw("Accept challenge (y/n)? ");
-            if (prompt_yesno()) {
-                net_send_code(fd, NETCODE_ACCEPT);
-                // TODO: start game
-            } else {
-                net_send_code(fd, NETCODE_DECLINE);
-            }
-        } else {
-            fprintf(stderr, "Server sent invalid gameinfo.\n");
-        }
-    }
-    
-    return cleanup(&settings, EXIT_SUCCESS);
+    return is_server(&settings) ? server_run(&settings) : client_run(&settings);
 }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/server.c	Mon Mar 17 15:39:36 2014 +0100
@@ -0,0 +1,86 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2014 Mike Becker. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "terminal-chess.h"
+#include <ncurses.h>
+
+int server_run(Settings *settings) {
+    Server server;
+    int exit_code = EXIT_SUCCESS;
+    
+    dump_gameinfo(&(settings->gameinfo));
+    printw("\nListening for client...\n");
+    refresh();
+    if (net_create(&server, settings->port)) {
+        perror("Server creation failed");
+        exit_code = EXIT_FAILURE;
+        goto quit;
+    }
+
+    if (net_listen(&server)) {
+        perror("Listening for client failed");
+        exit_code = EXIT_FAILURE;
+        goto quit;
+    }
+
+    /* net version handshake */
+    int fd = server.client->fd;
+    net_send_code(fd, NETCODE_VERSION);
+    if (net_recieve_code(fd) != NETCODE_VERSION) {
+        fprintf(stderr, "Client uses an incompatible software version.\n");
+        exit_code = EXIT_FAILURE;
+        goto quit;
+    }
+
+    printw("Client connected - transmitting gameinfo...");
+    refresh();
+
+
+    net_send_code(fd, NETCODE_GAMEINFO);
+    net_send_data(fd, &(settings->gameinfo), sizeof(settings->gameinfo));
+    printw("\rClient connected - awaiting challenge acceptance...");
+    refresh();
+    int code = net_recieve_code(fd);
+    if (code == NETCODE_ACCEPT) {
+        printw("\rClient connected - challenge accepted.");
+        clrtoeol();
+    } else if (code == NETCODE_DECLINE) {
+        printw("\rClient connected - challenge declined.");
+        clrtoeol();
+    } else {
+        fprintf(stderr, "Invalid client response\n");
+        exit_code = EXIT_FAILURE;
+        goto quit;
+    }
+    
+quit:
+    
+    net_destroy(&server);
+    return exit_code;
+}
--- a/src/terminal-chess.h	Mon Mar 17 14:35:53 2014 +0100
+++ b/src/terminal-chess.h	Mon Mar 17 15:39:36 2014 +0100
@@ -54,11 +54,15 @@
     Gameinfo gameinfo;
     char* port;
     char* serverhost; /* NULL, if we are about to start a server */
-    Server *server;
 } Settings;
 
 #define is_server(settings) !((settings)->serverhost)
 
+void dump_gameinfo(Gameinfo *gameinfo);
+
+int server_run(Settings* settings);
+int client_run(Settings* settings);
+
 #ifdef	__cplusplus
 }
 #endif

mercurial