src/network.c

Wed, 05 Feb 2014 14:07:43 +0100

author
Mike Becker <universe@uap-core.de>
date
Wed, 05 Feb 2014 14:07:43 +0100
changeset 1
e5fbb8f9edbe
child 2
0a08f79c320d
permissions
-rw-r--r--

added (single) client / server architecture

     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 int server_bind(Server *server) {
    35     server->fd = socket(server->info->ai_family,
    36         server->info->ai_socktype, server->info->ai_protocol);
    37     if (server->fd > -1) {
    38         int true = 1;
    39         setsockopt(server->fd, SOL_SOCKET, SO_REUSEADDR, &true, sizeof(int));
    40         if (bind(server->fd,
    41                 server->info->ai_addr, server->info->ai_addrlen)) {
    42             server->fd = -1;
    43             return 1;
    44         } else {
    45             return 0;
    46         }
    47     } else {
    48         return 1;
    49     }
    50 }
    52 int net_create(Server *server, char* port) {
    53     return net_find(server, "localhost", port) || server_bind(server);
    54 }
    56 int getaddrinfo_intrnl(char *host, char *port, struct addrinfo **info) {
    57     struct addrinfo hints;
    58     memset(&hints, 0, sizeof(hints));
    59     hints.ai_socktype = SOCK_STREAM;
    60     hints.ai_protocol = IPPROTO_TCP;
    62     return getaddrinfo(host, port, &hints, info);
    63 }
    65 int net_find(Server *server, char *host, char* port) {
    66     memset(server, 0, sizeof(Server));
    67     server->fd = -1;
    69     return getaddrinfo_intrnl(host, port, &(server->info));
    70 }
    72 int net_listen(Server *server) {
    73     listen(server->fd, 1);
    74     Client* client = calloc(1, sizeof(Client));
    75     client->fd = -1;
    76     server->client = client;
    78     client->fd = accept(server->fd,
    79         &(client->address), &(client->address_len));
    81     return client->fd == -1;
    82 }
    84 int net_connect(Server *server) {
    85     struct addrinfo *info;
    86     if (getaddrinfo_intrnl("localhost", NULL, &info)) {
    87         return 1;
    88     }
    90     Client* client = calloc(1, sizeof(Client));
    91     client->fd = socket(info->ai_family, info->ai_socktype, info->ai_protocol);
    92     server->client = client;
    94     freeaddrinfo(info);
    95     if (client->fd == -1) {
    96         return 1;
    97     }
    99     return connect(client->fd, server->info->ai_addr, server->info->ai_addrlen);
   100 }
   102 int net_destroy(Server *server) {
   103     if (server->info) {
   104         freeaddrinfo(server->info);
   105     }
   106     if (server->client) {
   107         shutdown(server->client->fd, SHUT_RDWR);
   108         free(server->client);
   109     }
   110     if (server->fd > -1) {
   111         return shutdown(server->fd, SHUT_RDWR);
   112     }
   114     return EXIT_SUCCESS;
   115 }

mercurial