浏览代码

:tada: Ajout fichier serveur

Arthur Brandao 6 年之前
父节点
当前提交
258bcd6a2b
共有 3 个文件被更改,包括 260 次插入0 次删除
  1. 48 0
      Serveur/server.h
  2. 116 0
      Serveur/server_tcp.c
  3. 96 0
      Serveur/server_udp.c

+ 48 - 0
Serveur/server.h

@@ -0,0 +1,48 @@
+/* 
+ * File:   server.h
+ * Author: Arthur Brandao
+ *
+ * Created on 14 novembre 2018
+ */
+
+#ifndef SERVER_H 
+#define SERVER_H
+
+
+/* --- Include --- */
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <string.h>
+
+/* --- Constantes --- */
+#define SERV_UDP 1
+#define SERV_TCP 2
+
+/* --- Structures --- */
+typedef struct server* Server;
+struct server{
+	int type; /* Le type de serveur (UDP ou TCP) */
+	/* Var server */
+	int socket; /* Socket du serveur */
+	int socket_client; /* Socket du client (TCP uniquement) */
+	struct sockaddr_in serv; /* Adresse du serveur */
+	struct sockaddr_in client; /* Adresse du client */
+	socklen_t addr;
+	/* Pointeur de fonction */
+	void (*server_bind)(Server, int);
+	ssize_t (*server_receive)(Server, char*, size_t);
+	void (*server_send)(Server, char*);
+	void (*server_accept)(Server);
+};
+
+/* --- Fonction --- */
+Server server_create_udp();
+Server server_create_tcp();
+void server_close_and_free(Server);
+void server_close_client(Server);
+
+#endif /* SERVER_H */

+ 116 - 0
Serveur/server_tcp.c

@@ -0,0 +1,116 @@
+/* 
+ * File:   server_tcp.c
+ * Author: Arthur Brandao
+ *
+ * Created on 14 novembre 2018
+ */
+
+#include "error.h"
+#include "server.h"
+
+/* ---  Fonctions privées --- */
+void server_bind_tcp(Server this, int port) {
+    /* Declaration variable */
+    int tmp;
+
+    /* Bind */
+    this->serv.sin_family = AF_INET;
+    this->serv.sin_port = htons(port);
+    this->serv.sin_addr.s_addr = htonl(INADDR_ANY);
+    tmp = bind(this->socket, (struct sockaddr*) &this->serv, sizeof (struct sockaddr_in));
+    if (tmp == ERR) {
+        free(this);
+        neterror(BIND_ERROR)
+    }
+
+    /* Listen */
+    tmp = listen(this->socket, SOMAXCONN);
+    if (tmp == ERR) {
+        free(this);
+        neterror(BIND_ERROR)
+    }
+}
+
+void server_accept_tcp(Server this) {
+    /* Accept */
+    this->socket_client = accept(this->socket, NULL, NULL);
+    if (this->socket_client == ERR) {
+        free(this);
+        syserror("Erreur lors de la demande de connexion ", 3)
+    }
+}
+
+ssize_t server_receive_tcp(Server this, char* buf, size_t size) {
+    int tmp;
+    /* Lecture message */
+    tmp = read(this->socket_client, buf, size);
+    if (tmp == ERR) {
+        free(this);
+        syserror("Erreur lors de la reception ", 3)
+    }
+    return tmp;
+}
+
+void server_send_tcp(Server this, char* msg) {
+    int tmp;
+    /* Envoi message */
+    tmp = write(this->socket_client, msg, strlen(msg) * sizeof (char));
+    if (tmp == ERR) {
+        free(this);
+        syserror("Erreur lors de l'envoi ", 3)
+    }
+}
+
+/* ---  Fonctions publiques --- */
+Server server_create_tcp() {
+    /* Declaration variable */
+    Server this;
+    int tmp, option;
+
+    /* Creation socket */
+    this = malloc(sizeof (struct server));
+    this->socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+    if (this->socket == ERR) {
+        free(this);
+        neterror(SOCKET_ERROR)
+    }
+    this->addr = sizeof (struct sockaddr_in);
+    memset(&this->serv, 0, sizeof (struct sockaddr_in));
+
+    /* Indique la possibilité de réutiliser la socket même si elle est en TIME_WAIT */
+    option = 1;
+    tmp = setsockopt(this->socket, SOL_SOCKET, SO_REUSEADDR, &option, sizeof (option));
+    if (tmp == -1) {
+        free(this);
+        neterror(SOCKET_ERROR)
+    }
+
+    /* Lien fonctions */
+    this->server_bind = server_bind_tcp;
+    this->server_receive = server_receive_tcp;
+    this->server_send = server_send_tcp;
+    this->server_accept = server_accept_tcp;
+
+    /* Type de serveur */
+    this->type = SERV_TCP;
+
+    /* Retour */
+    return this;
+}
+
+void server_close_client(Server this) {
+    /* Declaration variable */
+    int tmp;
+
+    /* Que pour TCP */
+    if (this->type != SERV_TCP) {
+        return;
+    }
+
+    /* Ferme */
+    tmp = close(this->socket_client);
+    if (tmp == ERR) {
+        free(this);
+        syserror("Erreur lors de la fermeture de la socket ", 3)
+    }
+}

+ 96 - 0
Serveur/server_udp.c

@@ -0,0 +1,96 @@
+/* 
+ * File:   server_udp.c
+ * Author: Arthur Brandao
+ *
+ * Created on 14 novembre 2018
+ */
+
+#include "error.h"
+#include "server.h"
+
+/* --- Fonctions privées --- */
+void server_bind(Server this, int port) {
+    /* Declaration variable */
+    int tmp;
+
+    /* Bind */
+    this->serv.sin_family = AF_INET;
+    this->serv.sin_port = htons(port);
+    this->serv.sin_addr.s_addr = htonl(INADDR_ANY);
+    tmp = bind(this->socket, (struct sockaddr*) &this->serv, sizeof (struct sockaddr_in));
+    if (tmp == ERR) {
+        free(this);
+        neterror(BIND_ERROR)
+    }
+}
+
+ssize_t server_receive_udp(Server this, char* buf, size_t size) {
+    /* Declaration variable */
+    int tmp;
+
+    /* Reception */
+    tmp = recvfrom(this->socket, buf, size, 0, (struct sockaddr*) &this->client, &this->addr);
+    if (tmp == ERR) {
+        free(this);
+        syserror("Erreur lors de la reception ", 3)
+    }
+
+    /* Retour */
+    return tmp;
+}
+
+void server_send_udp(Server this, char* msg) {
+    /* Declaration variable */
+    int tmp;
+
+    /* Envoi */
+
+    tmp = sendto(this->socket, msg, strlen(msg) * sizeof (char), 0, (struct sockaddr*) &this->client, sizeof (struct sockaddr_in));
+    if (tmp == ERR) {
+        free(this);
+        syserror("Erreur lors de l'envoi ", 3)
+    }
+}
+
+/* --- Fonctions publiques --- */
+Server server_create_udp() {
+    /* Declaration variable */
+    Server this;
+
+    /* Creation socket */
+    this = malloc(sizeof (struct server));
+    this->socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+    if (this->socket == ERR) {
+        free(this);
+        neterror(SOCKET_ERROR)
+    }
+    this->addr = sizeof (struct sockaddr_in);
+    memset(&this->serv, 0, sizeof (struct sockaddr_in));
+
+    /* Lien fonctions */
+    this->server_bind = server_bind;
+    this->server_receive = server_receive_udp;
+    this->server_send = server_send_udp;
+    this->server_accept = NULL;
+
+    /* Type de serveur */
+    this->type = SERV_UDP;
+
+    /* Retour */
+    return this;
+}
+
+void server_close_and_free(Server this) {
+    /* Declaration variable */
+    int tmp;
+
+    /* Ferme */
+    tmp = close(this->socket);
+    if (tmp == -1) {
+        free(this);
+        syserror("Erreur lors de la fermeture de la socket ", 3)
+    }
+
+    /* Supprime */
+    free(this);
+}