Переглянути джерело

Amélioration de la gestion des déconexion imprévue

Arthur Brandao 6 роки тому
батько
коміт
10ce36daf0
4 змінених файлів з 19 додано та 2 видалено
  1. 8 0
      Serveur/bomberstudent_server.c
  2. 2 1
      Serveur/error.c
  3. 1 0
      Serveur/error.h
  4. 8 1
      Serveur/server_tcp.c

+ 8 - 0
Serveur/bomberstudent_server.c

@@ -13,6 +13,9 @@
 #include "bomberstudent_server.h"
 #include "error.h"
 
+/* --- Extern --- */
+extern int serrno;
+
 /* --- Globale --- */
 arraylist get;
 arraylist post;
@@ -291,6 +294,11 @@ boolean send_client(int cliId, JsonEncoder* je){
     sprintf(msg, "%s\n", answer);
     //Envoi la reponse
     if(!cli->main->server_send(cli->main, msg)){
+        //Si la conneion est coupée
+        if(serrno == SEABORT){
+            //On ferme le client
+            remove_client(cliId);
+        }
         adderror("Impossible de repondre à la requete du client");
         free(answer);
         free(msg);

+ 2 - 1
Serveur/error.c

@@ -26,7 +26,8 @@ char* serrlib[] = {
     "Erreur lors de la reception des données",
     "Erreur lors de l'envoi des données",
     "Erreur lors de la fermeture de la socket",
-    "Erreur mauvais type de socket"
+    "Erreur mauvais type de socket",
+    "Erreur connexion interrompue"
 };
 Error error;
 

+ 1 - 0
Serveur/error.h

@@ -32,6 +32,7 @@
 #define SESEND 5
 #define SECLOSE 6
 #define SETYPE 7
+#define SEABORT 8
 
 /* --- Structure --- */
 typedef struct{

+ 8 - 1
Serveur/server_tcp.c

@@ -9,11 +9,13 @@
 #include <stdio.h>
 #include <unistd.h>
 #include <string.h>
+#include <errno.h>
 #include "error.h"
 #include "server.h"
 
 /* --- Extern --- */
 extern int serrno;
+extern int errno;
 
 /* --- Fonctions privées --- */
 boolean server_bind_tcp(Server this, int port) {
@@ -74,7 +76,12 @@ boolean server_send_tcp(Server this, char* msg) {
     /* Envoi message */
     tmp = write(this->socket_client, msg, strlen(msg) * sizeof (char));
     if (tmp == ERR) {
-        serrno = SESEND;
+        //Si connexion coupé (et SIGPIPE)
+        if(errno == EPIPE){
+            serrno = SEABORT;
+        } else {
+            serrno = SESEND;
+        }    
         addperror("Impossible d'envoyer les données");
         return false;
     }