SERVEUR DE CHAT MULTITHREADE EN C SOUS LINUX

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 28 août 2004 à 12:57
diagnebabacar0 Messages postés 8 Date d'inscription samedi 30 janvier 2010 Statut Membre Dernière intervention 2 juillet 2013 - 31 août 2012 à 04:43
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/25757-serveur-de-chat-multithreade-en-c-sous-linux

diagnebabacar0 Messages postés 8 Date d'inscription samedi 30 janvier 2010 Statut Membre Dernière intervention 2 juillet 2013
31 août 2012 à 04:43
super super super ! rien que de voir comment ca marche avec les thread qui sont trop compliqués pour moi(je suis un grand debutant )!
mais pour le client on fait deux thread d envoie et de réception ! ca serait super d en connaitre plus du coté client ! mais je vais éssayer de me casser la tête pour le client ca vais étre compliqué mais je vais prendre comme référence le code serveur !
merci pour le savoir que vous partager ! merci d étre genereux de ton savoir MetalDwarf .
oazize Messages postés 1 Date d'inscription lundi 10 novembre 2003 Statut Membre Dernière intervention 25 septembre 2007
25 sept. 2007 à 13:13
Code super propre!! merci c'est génial

Je digere le code et j'essairai de faire un client en flash.

Merci encore
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
6 nov. 2006 à 08:50
G 1 truK bi1 pr ke tu puiS nou liR...

On va tous parler corectement ok ? sinon, ça risque de devennir totalement illisible...

tu tapes :
user@linux$ telnet host port
dans une console linux

Moi j'ajoute un message pour remercier MetalDwarf, je lui dois mon augmentation de niveau depuis ces trois dèrnières années...
cs_facilus Messages postés 33 Date d'inscription lundi 19 juin 2006 Statut Membre Dernière intervention 15 novembre 2007
5 nov. 2006 à 00:28
j'ai lancé le source sous linux ,avec la commande " ./server " , mais je ne sais pas ce k'il faus faire par la suite , est ce ke je doit ecrire un autre programme pour ke le chatr fonctionne ???
merci de m'indiquer comment faire marchee ce source client /serveur
cyrtex Messages postés 3 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 1 octobre 2007
21 juin 2006 à 14:53
Pour ceux que ça interesse, voici un client ligne de commande fonctionnant avec ce serveur de chat:

http://globnet.free.fr/include/m1-client.exe

Il s'agit d'un "simple" programme telnet adapté pour faire en sorte que les messages arrivant ne viennent pas perturber la saisie d'un message en cours.
cs_chermy Messages postés 1 Date d'inscription vendredi 17 janvier 2003 Statut Membre Dernière intervention 18 avril 2006
18 avril 2006 à 16:08
j'aimerai savoir comment fait on pour avoir le client socket pour se connecter au serveur
merci d'avance
blade_m Messages postés 4 Date d'inscription mercredi 27 octobre 2004 Statut Membre Dernière intervention 29 octobre 2004
29 oct. 2004 à 21:09
Merci bcp, je vais essayer ca!
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
29 oct. 2004 à 11:00
Dans ce cas, recuperer ce serveur peut etre utile!!
Pour ecrire un client, c es vraiment pas dur il suffit de creer 2 threads (un pour lire l entree et un pour recevoir ce que dit le serveur), ou alors d utiliser select(). Le petit probleme c est que si un message arrive pendant que tu es en train d ecrire kkchose, ca va couper en 2 ce que tu ecris. Tu peux alors soit utiliser des entrees/sorties bloquantes (donc ne pas utiliser select() ni de threads), ou alors chercher dans la doc de ncurses (librairie permettant d avoir une interface "graphique" en mode console... enfin comme emacs a peu pres ou edit sous DOS...) si tu ne peux pas faire ca autrement.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
29 oct. 2004 à 10:17
forum mode console...
blade_m Messages postés 4 Date d'inscription mercredi 27 octobre 2004 Statut Membre Dernière intervention 29 octobre 2004
29 oct. 2004 à 10:11
Merci

Mais je dois faire ce projet sous linux en mode console, donc pas d'interface graphique!
aue des lignes de commandes
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
28 oct. 2004 à 15:58
Incroyable, coucou47 repond plus vite que moi aux commentaire sur ma source!!

Si tu veux etendre ce serveur, ca doit se faire sans trop de mal, d utant plus qu il ne manque presque rien pour faire de ce serveur un module integrable independamment du reste.
Si tu doit faire un client/serveur comme ca, tu peux batir une interface graphique sur un client tout simple, je pense que si tu connais la programmation graphique ca ne devrait pas etre trop long. Par contre pour faire un forum, il va falloir aller chercher ailleurs, car si tu veux modifier ce serveur pour ca il va falloir mettre beaucoup de choses en plus. Le plus simple dans ce cas est peut etre d utiliser le protocole HTTP et d'integrer php a ton serveuir (ce qui se fait tres facilement sous Unix, il suffit de recuperer la sortie de la page php passee au programme php).
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
28 oct. 2004 à 13:19
dans ce cas je teproposes d'adapter ce serveur au languge http, et t'auras pas a programmer le client, t'auras Mozilla ou Ie pour ça.
blade_m Messages postés 4 Date d'inscription mercredi 27 octobre 2004 Statut Membre Dernière intervention 29 octobre 2004
28 oct. 2004 à 13:16
car j'ai un projet pour mes études:

faire un client/serveur avec forum, administration, chat...


Merci
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
28 oct. 2004 à 09:31
telnet marche très bien, sinon tu peux en écrire un (regardes la caprure d'écran, c'etstrsè joli KDE)
blade_m Messages postés 4 Date d'inscription mercredi 27 octobre 2004 Statut Membre Dernière intervention 29 octobre 2004
28 oct. 2004 à 09:10
Petite question, aurais tu le client qui va avec le serveur?

Merci
FearBlue Messages postés 149 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 26 octobre 2008
13 sept. 2004 à 22:05
oki merci les gars ca marche nikel
merci bcp
++ et bonn prog's
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
13 sept. 2004 à 21:26
c'est ce que j'ai dit, t'as ces options tt au début de ta source en commentaire, faut pasque compiler, faut lire aussi ^^
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
13 sept. 2004 à 20:41
Non c est pas la qu est le probleme. Le probleme c est que la source utilise la bibliotheque pthread, (qui est presente sur tous les systemes), et donc il faut preciser l option -lpthread a gcc ou g++. Ca devrait quand meme passer avec g++, mais c est du C, donc gcc!!
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
13 sept. 2004 à 19:58
si tu lis la première ligne de la source, t'as la ligne de code a passer au compilo... et bizarement, comme ce programem est en C etpas en C++, on utilises gcc et pas C++

Moi je l'ai pas testé sous mandrake 10.0 mais 10.1, et si tu regardes la copie d'écran, tu devrais voir rapidement que metaldwarf est sous le même os que toi
FearBlue Messages postés 149 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 26 octobre 2008
13 sept. 2004 à 19:55
slt a tous
je susi sous MANDRAKE 10.0
et g l'erreur suivante lors de la compilation

[florian@athlon serveur chat]$ g++ server_flo.c -o server2
/home/florian/tmp/cck6idJN.o(.text+0xe40): In function `main':
: undefined reference to `pthread_create'
collect2: ld returned 1 exit status
[florian@athlon serveur chat]$ g++ server_flo.c -o server2
/home/florian/tmp/cceCSeu4.o(.text+0xc78): In function `interact(void*)':
: undefined reference to `pthread_cancel'
/home/florian/tmp/cceCSeu4.o(.text+0xe52): In function `main':
: undefined reference to `pthread_create'
collect2: ld returned 1 exit status

g essayer avec Gcc et c pareil
si vous savez ???
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
3 sept. 2004 à 20:23
Oui c est vrai que j aurais pu le signaler... Et ce n est pas dur a programmer, les threads c est facile (la preuve, le code est simple), il faut seulement connaitre l API, et faire attention d eviter les corruptions eventuelles de donnees avec des mutex (ici c est simple il n y en a qu un seul, et pas de variable de condition). D ailleurs je ne connais pas trop les threads, c est mon premier code ou je les emploie!!

Pour porter ce code sous windows, il y acdeux problemes : les socket et les threads. Les sockets ce n est pas trop un probleme, en modifiant les fonctions create_server() et server_accept() ca passe sans probleme (et en rajoutant un appel a la fonction d initialisation des sockets windows). Par contre pour les threads l API utilisee ici est celle des threads POSIX (donc *hautement* portable), mais windows a sa propre API, et je ne sais pas comment adapter (bien sur les mutex existent aussi sous windows mais l API differe). Le mieux est d aller voir sur MSDN je pense, et peut etre que microsoft offre une compatibilite avec l API POSIX (j espere...).
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
3 sept. 2004 à 19:53
bon, c'e"ts vrai que le code du linux mag n'était qu'une partie de carte par rapport au tien, je n'ai jamais voulu dire que ton travail était nul, j'ai d'ailleur souligné être dans l'incapacitée de faire ce genre de serveru, même avec le linuxmag... les threads je ne maitrises pas... et son code n'était pas mature... Tu es largement meilleur programmeur que moi, je n'ai jamais dis le contraire, mais tu aurais pu signaler le fait que ces deux fonctions apartiennent à qqn d'autre..

Sinon, j'ai un copain qui cherches a porter ce logiciel, on peut le faire comment pour qu'il fonctionne sous windows ? (quelle idée aussi de vouloir faire du windows réseau... ^^)
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
3 sept. 2004 à 17:46
coucou47> He he oui le code de base des sockets reseaux est celui du Linux Magazine 41. En fait j avais recopie les fonctions create_server() et server_accept() au moment de la parution de ce Linux Magazine et depuis je fais un copier-coller de ces fonctions dans tous mes codes reseaux. Je precise quand meme que ce sont des fonctions de base qui se trouvent un peu partout (comme le fait remarquer l auteur de cet article dans un autre Linux Mag).
Sinon tout le code du serveur en lui meme est evidemment de moi, et en particulier la gestion des threads qui est le point que je voulais etudier en programmant ce serveur.

jom1012> Merci pour le code ca fait plaisir. Pour la liste des clients connectes c est tres simple, c est une commande qui est deja implementee dans le serveur. Si tu regarde bien c est la commande "/list". En fait toute les informations sur les clients sont contenus dans un tableau de pointeur sur une structure qui contient les infos sur le client, dont un champ pseudo (un char *) qui est le pseudo du client en question. Pour obtenir la liste des clients il suffit alors (cote serveur) de lire ces valeurs en parcourant le tableau (apres verrouillage de la structure par le mutex). Si tu veux rajouter des commandes c est tres simple. Il n y a qu une seule question a se poser : est ce que ma commande DOIT acceder (en lecture ou ecriture) au tableau des clients connectes? Si c est le cas il faut prendre le mutex AVANT de manipuler et le relacher APRES, en le gardant le moins de temps possible. D ailleurs le code peut etre ameliore en certains endroits car ceratines fonctions peuvent etre bloquantes sont appeles alors que le mutex est pris mais ce probleme n est pas tres grave. Si tu ne fais que toucher a me (la structure du client), il ne sert a rien de toucher au mutex.
Pour la realisation d un client en C/GTK je suis tout a fait pour, et je voulais le faire mais je ne connais pas le gtk et je n ai pas le temps pour me plonger dedant. Donc bien sur que tu as le droit de reprendre ce que j ai fait si tu mentionnes que le serveur original est de moi et que tu mets ce que tu as faut sur ce site.

Voila si tu as d autres questions je suis la pour y repondre.
jon1012 Messages postés 1 Date d'inscription samedi 10 mai 2003 Statut Membre Dernière intervention 3 septembre 2004
3 sept. 2004 à 00:44
Salut, j'adore ton code (pris sur linux mag ou pas je m'en fiche lol, t'es un boss ;)) !
Par contre, je cherche comment envoyer une liste des clients connectés (je compte faire un client en gtk/c derriere ton serveur un peu modifié, si tu m'en donne l'autorisation bien sur !), si tu pouvais me mettre sur la piste ce serait génial, je n'y comprend pas grand chose en interactions entre threads et la maniere dont je peux trouver la liste de tous les users connectés...
Enfin voilà...
Si tu veux, je pourrais poster ici le code modifié du serv pour aller avec mon client ainsi que mon client (qui normalement sera portable sous windows) :)

Voili voilà, donc bah si tu pouvai me donner ton autorisation de continuer ce que je fais :) (la license n'etant pas indiquée... si c'est du gpl, n'hésite pas à me le dire lol ;))
Voilà ! En tout cas, très bon code, bravo !

Jonathan
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
2 sept. 2004 à 21:21
j'eesayais de m'inspirer de ton code pour le faire sans threads... et j'ai aussi lu le linux mag 41...

j'ai croisé une étrange ressemblance entre les deux codes présentés, évidement, le tien a des threads que le code du linux mag n'a pas, mais c'est les mêmes noms de variables, parfois les mêmes lignes...

bon, je ne suis pas capable de reprendre un code de linux mag pour y ajouterdes threads, mais par contre le repater si...

D'ou viennent ces ressemblances ?
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
28 août 2004 à 16:46
Oui ce serveur n est pas concu pour repondre au protocole IRC (trop complique!!) meme si ca doit etre faisable avec du temps...
et oui, mandrake 10.0 mais avec kernel et compilateur recompiles et mis a jour
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
28 août 2004 à 12:57
Mandrake 10.0 ?
Je croyais que xmms ne fonctionnait pas sur cet os ??? Bon, ça devait être spécifique a ma carte son lol...
Mais c'ets quoi ton pc pour survivre a 2 konqueror + xmms + 6 consoles dnas 1 terminal + un autre terminal + kwrite et tt ça dans un suel bureau .....? les 5 autres bureaux ont l'air d'être aussi pleins...
pas mal le système... j'ai esayé ton serveru sur un navigateur web... bon, ça marche pas, mais fallait s'y attendre, en telnet c'est parfait !
Se compile aussi bien sous mandrake 10.1


enfin voila j'ai mis 10/10
Rejoignez-nous