Bonjour à tous,

Je dois développer une petite messagerie instantanée en mode console, en utilisant la fonction select.

Mon problème se trouve au niveau du serveur. Celui-ci doit accepter de nouvelles connexions et lors de la réception d'un message client, le transmettre à tous les autres clients. Le problème est que lorsque je connecte un client puis un deuxième, les messages du premier client ne sont plus détectés...

Voici le bout de code qui semble être en cause :

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
FD_ZERO(&readfds);
FD_SET(sockfd, &readfds);
fd_max = sockfd;
 
while (1)
{
 
    switch (select(fd_max + 1, &readfds, NULL, NULL, NULL))
    {
 
        case -1:
        {
    	    perror("select");
    	    return EXIT_FAILURE;
    	}    		
 
    	case 0:
    	    break;
 
    	default:
    	{
 
    	    int i, j;
 
    	    // Sent message
	    // Searching sender
    	    for (i = 0; i < num_clients; i++)
    	    {
 
   	        if (FD_ISSET(clients[i].sockfd, &readfds))
   		{
 
   		    // Getting message
   		    while ((n = recv(clients[i].sockfd, buffer, sizeof(buffer) - 1, 0)) > 0)
   		    {
 
   		        buffer[n] = '\0';
 
   		        printf("message recu du client %d : %s", i, buffer);
 
   		        // Sending this message to others
   		        for (j = 0; j < num_clients; j++)
   		        {
   		            if (i != j)
   			    {
   			        if (send(clients[j].sockfd, buffer, n, 0) == -1)
   			        {
   			            perror("send");
   				    return EXIT_SUCCESS;
   				}
   			    }
   			}
 
   			// Breaking if message was complete
   			if (n < sizeof(buffer - 1))
   			    break;
 
   		    }
 
   		    // Error during reception
   		    if (n == -1)
   		    {
   		        perror("recv");
   		        close(sockfd);
   			return EXIT_FAILURE;
   		    }
 
    		}
 
    	    }
 
    	    // New client
    	    if (FD_ISSET(sockfd, &readfds) && num_clients < MAX_USERS)
    	    {
 
    	        // Accepting connection
    	        if ((clients[num_clients].sockfd = accept(sockfd, (struct sockaddr *)(&clients[num_clients].addr), &sin_size)) == -1)
    		{
    		    perror("accept");
    		    close(sockfd);
    		    return EXIT_FAILURE;
    		}
 
    		// Updating fd_set and fd_max
    		FD_SET(clients[num_clients].sockfd, &readfds);
    		if (clients[num_clients].sockfd > fd_max)
    		    fd_max = clients[num_clients].sockfd;
 
    		printf("Nouvelle connexion : %d\n", clients[num_clients].sockfd);
 
    		num_clients++;
 
    	    }
 
    	    break;	
 
    	}
 
    }
 
}
C'est la première fois que j'utilise cette fonction select, pouvez-vous me dire ce qui ne va pas ?

Merci !