src/network.c

Wed, 11 Jun 2014 15:38:01 +0200

author
Mike Becker <universe@uap-core.de>
date
Wed, 11 Jun 2014 15:38:01 +0200
changeset 48
0cedda2544da
parent 46
4dcfb4c58b6d
child 55
54ea19938d57
permissions
-rw-r--r--

added return code to move validation (for more informative messages) + fixed a bug where simulations added movelist items to the original gamestate

     1 /*
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     3  *
     4  * Copyright 2014 Mike Becker. All rights reserved.
     5  *
     6  * Redistribution and use in source and binary forms, with or without
     7  * modification, are permitted provided that the following conditions are met:
     8  *
     9  *   1. Redistributions of source code must retain the above copyright
    10  *      notice, this list of conditions and the following disclaimer.
    11  *
    12  *   2. Redistributions in binary form must reproduce the above copyright
    13  *      notice, this list of conditions and the following disclaimer in the
    14  *      documentation and/or other materials provided with the distribution.
    15  *
    16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    19  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
    20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    26  * POSSIBILITY OF SUCH DAMAGE.
    27  *
    28  */
    30 #include <stdlib.h>
    31 #include <string.h>
    32 #include "network.h"
    34 #define new_socket() socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    36 int net_create(Server *server, char* port) {
    37     server->info = NULL;
    39     struct sockaddr_in addr;
    40     addr.sin_family = AF_INET;
    41     addr.sin_addr.s_addr = INADDR_ANY;
    42     addr.sin_port = htons(atoi(port));
    44     server->fd = new_socket();
    45     if (server->fd > -1) {
    46         int true = 1;
    47         setsockopt(server->fd, SOL_SOCKET, SO_REUSEADDR, &true, sizeof(int));
    48         if (bind(server->fd, (struct sockaddr*)&addr, sizeof(addr))) {
    49             server->fd = -1;
    50             return 1;
    51         } else {
    52             return 0;
    53         }
    54     } else {
    55         return 1;
    56     }
    57 }
    59 static int getaddrinfo_intrnl(char *host, char *port, struct addrinfo **info) {
    60     struct addrinfo hints;
    61     memset(&hints, 0, sizeof(hints));
    62     hints.ai_socktype = SOCK_STREAM;
    63     hints.ai_protocol = IPPROTO_TCP;
    65     return getaddrinfo(host, port, &hints, info);
    66 }
    68 int net_find(Server *server, char *host, char* port) {
    69     memset(server, 0, sizeof(Server));
    70     server->fd = -1;
    72     return getaddrinfo_intrnl(host, port, &(server->info));
    73 }
    75 int net_listen(Server *server) {
    76     listen(server->fd, 1);
    77     Client* client = calloc(1, sizeof(Client));
    78     client->fd = -1;
    79     server->client = client;
    81     client->fd = accept(server->fd,
    82         &(client->address), &(client->address_len));
    84     return client->fd == -1;
    85 }
    87 int net_connect(Server *server) {
    89     Client* client = calloc(1, sizeof(Client));
    90     client->fd = -1;
    91     server->fd = new_socket();
    92     server->client = client;
    94     if (server->fd == -1) {
    95         return 1;
    96     }
    98     return connect(server->fd, server->info->ai_addr, server->info->ai_addrlen);
    99 }
   101 int net_destroy(Server *server) {
   102     if (server->info) {
   103         freeaddrinfo(server->info);
   104     }
   105     if (server->client) {
   106         shutdown(server->client->fd, SHUT_RDWR);
   107         free(server->client);
   108     }
   109     if (server->fd > -1) {
   110         return shutdown(server->fd, SHUT_RDWR);
   111     }
   113     return EXIT_SUCCESS;
   114 }
   116 void net_send_code(int socket, uint8_t code) {
   117     send(socket, &code, sizeof(uint8_t), 0);
   118 }
   120 void net_send_data(int socket, uint8_t code, void *data, size_t len) {
   121     uint8_t pkg[len+1];
   122     pkg[0] = code;
   123     memcpy(pkg+1, data, len);
   124     send(socket, pkg, len+1, 0);
   125 }
   127 uint8_t net_recieve_code(int socket) {
   128     uint8_t code;
   129     if (recv(socket, &code, sizeof(code), 0) == sizeof(code)) {
   130         return code;
   131     } else {
   132         return NETCODE_CONNLOST;
   133     }
   134 }
   136 void net_recieve_data(int socket, void *data, size_t len) {
   137     recv(socket, data, len, MSG_WAITALL);
   138 }

mercurial