[C] Server plante

Fermé
shootme Messages postés 1 Date d'inscription lundi 9 juillet 2012 Statut Membre Dernière intervention 9 juillet 2012 - 9 juil. 2012 à 19:14
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 10 juil. 2012 à 08:26
Bonsoir,
Voila j'ai commencé a coder un server de tchat...

Probléme: Dès que un utilisateur ce déconnect l'appli par en cacahouéte.

Voici le code :
//main.h

struct connected {
    char *pseudo;
    char *ip;
    int sock;
    struct connected *next;
};

 extern connected *co;

//main.c

struct connected *co = NULL; // je centralise toute les infos des connecté ici

DWORD WINAPI client_boucle(void * lpParameter) {

    struct connected *user = (struct connected *) malloc(sizeof(connected));
    struct connected *d = NULL;
    int max = 0;
    int i = 0;
    char buffer[2048];
    fd_set fs;


  while(1)
  {
          FD_ZERO(&fs); //mise a zéro
          FD_SET(ssock, &fs); //set ssock dans mon fd

          d = co; //Ajoute la totalité de la struct connected dans d
          while (d != NULL) {
              FD_SET(d->sock, &fs); //ajout tous les connecté dans fd
              d = d->next;
          }

          if (select(max + 1, &fs, NULL, NULL, NULL) == -1) break;

          if (FD_ISSET(ssock, &fs)) { //Connexion utilisateurs
              SOCKADDR_IN csin;
              int sinsize = sizeof(csin);
              csock = accept(ssock, (SOCKADDR *)&csin, &sinsize);
              nb_con++;
              lecture_client(csock, buffer); //info que l'user transmet a la connexion
              user->pseudo = strdup("test");
              user->ip = strdup("127.0.0.1");
              user->sock = csock;
              add_user(user); //Ajout en struct


       }else { //action d'un utilisateur

          d = co;
           while (d != NULL) {
               if (FD_ISSET(d->sock, &fs)) { //Je regarde quel utilisateur 

           if(lecture_client(d->sock, buffer) == 0) {// utilisateur Déconnecté
               nb_con--;

               closesocket(d->sock); //fermeture de la socket utilisateur
               rm_user(d); //suppression de l'utilisateur.
               }
              }
               d = d->next;
           }
         }
  }
  return 0;
}



Voila tout me parait normal... mais il plante et fait n'importe quoi.

exemple il lance la boucle

while (d != NULL) {

 if (FD_ISSET(d->sock, &fs)) { ....


plusieurs fois quand un utilisateur ce déconnect...

A voir également:

1 réponse

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
10 juil. 2012 à 08:26
Salut.
un peu compliquer ton histoire, il manque des bouts de code.
les fonction fd_* c'est toi qui les a créer ou ça fait parti d'une bibliothèque ?
0