src/network.c

Tue, 18 Sep 2018 15:02:08 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 18 Sep 2018 15:02:08 +0200
changeset 69
c8f2c280cff7
parent 59
3fa1de896666
permissions
-rw-r--r--

adds unicode support

     1 /*
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     3  *
     4  * Copyright 2016 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 = malloc(sizeof(Client));
    78     client->fd = -1;
    79     client->address_len = sizeof(client->address);
    80     server->client = client;
    82     client->fd = accept(server->fd,
    83         &(client->address), &(client->address_len));
    85     return client->fd == -1;
    86 }
    88 int net_connect(Server *server) {
    90     Client* client = calloc(1, sizeof(Client));
    91     client->fd = -1;
    92     server->fd = new_socket();
    93     server->client = client;
    95     if (server->fd == -1) {
    96         return 1;
    97     }
    99     return connect(server->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 0;
   115 }
   117 void net_send_code(int socket, uint8_t code) {
   118     send(socket, &code, sizeof(uint8_t), 0);
   119 }
   121 void net_send_data(int socket, uint8_t code, void *data, size_t len) {
   122     uint8_t pkg[len+1];
   123     pkg[0] = code;
   124     memcpy(pkg+1, data, len);
   125     send(socket, pkg, len+1, 0);
   126 }
   128 uint8_t net_recieve_code(int socket) {
   129     uint8_t code;
   130     if (recv(socket, &code, sizeof(code), 0) == sizeof(code)) {
   131         return code;
   132     } else {
   133         return NETCODE_CONNLOST;
   134     }
   135 }
   137 void net_recieve_data(int socket, void *data, size_t len) {
   138     recv(socket, data, len, MSG_WAITALL);
   139 }

mercurial