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 :
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 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) ...
Merci, toute aide sera bienvenu.
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; }
Partager