Bonjour,

j'ai un fait un petit serveur avec select qui doit gerer le multi client.
Il marche plutot bien quand on se connecte avec des humains.

mais avec une moulinette de test (dont je n'ai pas le code source) qui en gros va connecter pleins de clients rapidement a la suite, j'ai quelques soucis:

Notament mon select debloque et deconnecte une 50e de clients car read sur la socket retourne 0.(logique que je deconnecte dans ce cas). mais je ne devrais pas les deconnectes selon la moulinette -_-.

Je voulais savoir d'ou ce genre de probleme peut venir?

Une partie de mon code source :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
 
  FD_ZERO(sd->fd_read);
  FD_ZERO(sd->fd_write);
  clts = sd->clts;
  FD_SET(sd->socket, sd->fd_read);
  fd_max = sd->socket;
  while (clts != NULL)
    {
      FD_SET(((t_clt*)(clts->data))->socket, sd->fd_read);
      fd_max = max(fd_max, ((t_clt*)(clts->data))->socket);
      if ((dbg = get_buf(((t_clt*)(clts->data))->out, BUF_SIZE)) != NULL)
        {
          FD_SET((((t_clt*)(clts->data)))->socket, sd->fd_write);
        }
      clts = clts->next;
    }
  if ((idbg = select(fd_max + 1, sd->fd_read, sd->fd_write, NULL, sd->tv)) == -1)
...
et pour les resultats :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
 
  t_list                *clts;
  t_list                *next;
  int                   retread;
  int                   add;
 
  add = 0;
  if (FD_ISSET(sd->socket, sd->fd_read))
    {
      add_clt(sd);
      add = 1;
    }
  clts = sd->clts;
  next = (clts == NULL) ? NULL : clts->next;
  while (clts != NULL)
    {
      if (add == 0 || (clts != sd->clts))
        {
          retread = 1;
          if (FD_ISSET(((t_clt*)(clts->data))->socket, sd->fd_read))
            manage_read_clt(sd, clts, &retread);
          if (retread && FD_ISSET(((t_clt*)(clts->data))->socket, sd->fd_write))
            manage_write_clt(sd, clts);
        }
      else
        printf("disable rw socket %d\n", ((t_clt*)clts->data)->socket);
      clts = next;
      if (clts != NULL)
        next = clts->next;
    }
Merci, toute aide sera bienvenu.