SERVER IRC EN C (PROTOCOLE 'MAISON')

cs_max12 Messages postés 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Dernière intervention 7 juillet 2014 - 19 mars 2006 à 04:59
cs_Worst Messages postés 19 Date d'inscription vendredi 22 février 2002 Statut Membre Dernière intervention 13 décembre 2006 - 1 févr. 2010 à 15:39
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/36603-server-irc-en-c-protocole-maison

cs_Worst Messages postés 19 Date d'inscription vendredi 22 février 2002 Statut Membre Dernière intervention 13 décembre 2006
1 févr. 2010 à 15:39
Bonjour, vous aurez du mal à dialoguer avec un "client officiel", puisque le serveur fourni ici ne respecte pas du tout (mais alors pas du tout du tout) la RFC... il a juste été réalisé pour voir comment faire des connexions clients / serveurs, etc.

Pour le tester sur un même machine, il suffit de lancer le serveur dans une console, et de faire un netcat dans une autre...
jerome4304 Messages postés 1 Date d'inscription dimanche 31 décembre 2006 Statut Membre Dernière intervention 1 février 2010
1 févr. 2010 à 15:10
Bonjour,
Comment puis-je faire pour tester ce serveur IRC sur une même machine (ubuntu sur vmware) avec un client IRC "officiel" (xchat pour ne pas le citer)?
Merci par avance,
Jerome
cs_max12 Messages postés 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Dernière intervention 7 juillet 2014
19 mars 2006 à 17:53
ok merci de cette explication :)
cs_Worst Messages postés 19 Date d'inscription vendredi 22 février 2002 Statut Membre Dernière intervention 13 décembre 2006
19 mars 2006 à 12:48
Pour le poll, regarde la fonction 'Server_listen()' du fichier 'server.c'. Normalement, il y a pas mal de commentaires.

Le principe utilisé est le suivant :
- on crée un tableau de structures 'pollfd' (poll file descriptor ?), de la taille du nombre maximal de personnes acceptées
- on initialise tous les file descriptors dedans à '-1' (non utilisé)
- lorsqu'un client se connectera, on recherchera une case dont le fd est à -1, et on l'associe au client
- s'il n'y a plus d'élément non utilisé, c'est que le serveur est plein.

Il y a ensuite 2 sortes d'actions à gérer avec le poll :
1) le serveur reçoit une demande de connexion
2) un client envoie des informations au serveur

Il faut dont en théorie 2 'poll', 1 qui écoute uniquement le serveur, et un qui écoute tous les clients pour voir si quelqu'un demande quelque chose.

Pour éviter ça, on colle le file descriptor du serveur au début du tableau. Comme ça, on ne fait plus qu'un seul poll qui écoute le serveur et les clients en même temps.

Du coup, quand on parcourt le tableau pour savoir qui a quelque chose de nouveau à faire, on traite différement la case 0 et les autres. Si c'est la case 0, c'est que le serveur vient de recevoir une demande de connexion. Si c'est une autre case, c'est un client qui veut envoyer un message.

Je crois que c'est à peu près tout. Ah non : pour détecter qu'il y a quelque chose à faire pour un file descriptor donné, il suffit de faire un :
if(polls[i].fd != -1 && polls[i].revents & POLLIN) { ... }

"Est-ce qu'il y a bien un client dans cette case, et est-ce qu'il y a un truc à lire"
cs_Alain Proviste Messages postés 908 Date d'inscription jeudi 26 juillet 2001 Statut Modérateur Dernière intervention 1 février 2015 2
19 mars 2006 à 05:16
franchement personne peut t'en vouloir de pas respecter la rfc. Je pense que la rfc irc est la plus pourfendue, coté client comme coté server :)
cs_max12 Messages postés 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Dernière intervention 7 juillet 2014
19 mars 2006 à 04:59
Salut, tu voudrais m'expliquer un peu le concept de "poll" ?
Rejoignez-nous