Client/Serveur : tchat, envoi à tous les clients [C] - C - Programmation
Marsh Posté le 12-03-2007 à 19:52:21
Je pense que fork copie la mémoire mais que les processus ne la partage pas, donc à chaque fois que tu rajoutes un client, il connait ceux d'avant mais les autres ne le connaissent pas puisque la socket est "ajoutée" dans la mémoire du fils.
Peut être que si tu fais le read() dans le processus fils au lieu du père, le fils aura accès au "bon tableau de sockets" mais je n'en suis pas sûr. Sinon utilise des threads...
Donne la solution quand tu l'auras trouvée stp, ça m'intéresse.
Marsh Posté le 13-03-2007 à 14:13:36
select() est beaucoup plus adapte pour ca.
http://beej.us/guide/bgnet/output/ [...] tml#select
en gros chaque fois que tu accepte un client (avec accept()) tu ajoute cette nouvelle socket dans une sorte de "liste" de file descriptors a surveiller (tu surveilles si ya des nouvelles donnees a lire, ou a ecrire, dessus.) Puis tu appelles select avec comme parametre cette liste, et un eventuel laps de temps pendant lequel select va bloquer en attendant des donnees. Quand tu sors de select avant la fin du laps de temps, tu parcours la liste de tes fd (avec for par exemple) et tu verifie si c'est un file descriptor ayant des donnees en attente (avec FD_ISSET), et si c'est le cas, par exemple en lecture, bah tu lis dessus, et dans le cas d'un serveur de tchat par exemple, tu re-parcours tous les files descriptors en ecrivant dessus ce que tu viens de lire sur le filedescriptor ayant des donnees.
Voila, c'est tres grossierement resume, mais l'idee y est.
Marsh Posté le 13-03-2007 à 16:55:30
exact.
C'est comme ça que j'avais fait à l'IUT.
C'est coté client que j'avais fait un thread avec un read pour afficher les messages reçus même pendant que l'utilisateur tapais un message (en utilisant bêtement scanf).
Marsh Posté le 12-03-2007 à 19:33:22
Bonjour,
je suis entrain d'essayer de programmer un serveur qui accepte plusieurs clients, chaque clients peut parler, et alors les autres clients connectés doivent recevoir le message, cependant ca ne fonctionne pas vraiment mon code, et c'est plutot bizarre
Voici la partie du serveur qui fait default
A savoir que ca fonctionne, mais de manière etrange
je m'explique ... si j'ai trois clients qui se connecte, le derniere clients connecté qui envoit son message, le serveur le retransmet sur les deux autres,
si le deuxième client envoit un msg, il sera retransmit uniquement sur le premier client, et si le premier client envoit un msg, personne le recevra..
Don en gros, pour l'instant mon code renvoit le message uniquement aux clients connectés avant le client qui ecrit le message...
Merci beaucoup d'avance si quelqu'un trouve la solution