PARSER IRC

Xenul Messages postés 35 Date d'inscription mardi 8 août 2006 Statut Membre Dernière intervention 28 octobre 2007 - 6 déc. 2006 à 15:57
bustarhy Messages postés 13 Date d'inscription mardi 20 avril 2004 Statut Membre Dernière intervention 7 janvier 2007 - 24 déc. 2006 à 19:26
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/40604-parser-irc

bustarhy Messages postés 13 Date d'inscription mardi 20 avril 2004 Statut Membre Dernière intervention 7 janvier 2007
24 déc. 2006 à 19:26
merci
cs_Thaeron Messages postés 202 Date d'inscription vendredi 6 juillet 2001 Statut Membre Dernière intervention 31 octobre 2007
24 déc. 2006 à 19:21
http://www.siteduzero.com/tuto-3-8-0-apprenez-a-programmer-en-c-c.html#part_864

Tiens ya les pointeurs et l'allocation dynamique de mémoire.
C'est vraiment très très simple.
(Tu peux aussi me trouver sur l'irc irc.sagwin.org channel #programmation )
bustarhy Messages postés 13 Date d'inscription mardi 20 avril 2004 Statut Membre Dernière intervention 7 janvier 2007
24 déc. 2006 à 19:12
ouai mais malloc je connais pas du tout.je cherche un tuto sur la gestion de la memoire mais je trouve pas grand chose.ca m'ennui pas mal car je sais que le code fonctionne mais je pourrait l'ameliorer.le seul problem cest que niveau memoire/pointeur j'ai rien la dessus.
cs_Thaeron Messages postés 202 Date d'inscription vendredi 6 juillet 2001 Statut Membre Dernière intervention 31 octobre 2007
24 déc. 2006 à 19:03
Hey Bustarhy calme toi. Surtout que Kirua souligne le fait qu'il utilise des class (evidement y'en a pas en C) donc il ne critique en aucun cas ton code.
La paranoîa est mauvaise pour la santé.
Ravi que mon aide ai pu te servir Kirua.
Bustarhy en plus ton code est bon (surtout la version 2) puisque j'utilise un code similaire dans mon bot (<joke> qui est bien puisqu'il est de moi </joke>).
Après pour pinailler un peu tu devrais éviter d'utiliser des tableaux statiques qui mangent beaucoup de mémoire (souvent pour rien).
Le dynamique c'est bien, malloc et realloc sont tes amis.
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
24 déc. 2006 à 18:47
je n'ai PAS dit que ton code était inutile. Tu sais, lire un message et chercher l'interprétation la plus négative possible, c'est avant tout une occupation de jeune fille adolescente. Quand je te dis quelque chose, ça ne veut rien dire d'autre. J'ai dit: je préfère mon code (je), je n'ai pas dit: ton code est mauvais (non). j'ai dit merci à thaeron. Je n'ai pas dit: tu es mauvais (non). C'est fini mtnt la crise?
bustarhy Messages postés 13 Date d'inscription mardi 20 avril 2004 Statut Membre Dernière intervention 7 janvier 2007
24 déc. 2006 à 18:19
je le trouve plus utile que celui-ci puisqu'il est autonome et encapsulé dans une classe; je l'ai fait conformément à la grammaire EBNF spécifiée dans la RFC IRC 2812 (de mémoire)) et avec les sockets non bloquantes + select, c'est vrmnt super. Merci.
relie la phrase svp et lit la en pensant comment d'autres que toi pourrait l'interpreter.
car quand je lie ca je suis desolé mais tu insinu qu'il ne sert a rien.certe tu as peut etre fais un parser irc mais rien a voir avec celui la.donc ne dit pas qu'il est inutile.bref relie toi relie la description de mon code et le code en meme temps et tu me comprendra.
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
24 déc. 2006 à 18:12
1/ "je le trouve plus utile" -> c'est mon avis, dans le cadre de mon application.
2/ si tu postes ton code, je suppose a priori que c'est pour en avoir une critique (du reste, je n'ai pas commenté ton code).

Où est-ce que tu vois que je dis que ton code ne sert à rien? Pourquoi suggérer d'utiliser un outil compliqué est-il constructif?

Du reste, l'essence de mon message, c'était de remercier Thaeron pour ses conseils.
bustarhy Messages postés 13 Date d'inscription mardi 20 avril 2004 Statut Membre Dernière intervention 7 janvier 2007
24 déc. 2006 à 18:09
KIRUA >>Merci Thaeron, ça marche nickel. J'ai écrit un parser IRC personnel (je le trouve plus utile que celui-ci puisqu'il est autonome et encapsulé dans une classe; je l'ai fait conformément à la grammaire EBNF spécifiée dans la RFC IRC 2812 (de mémoire)) et avec les sockets non bloquantes + select, c'est vrmnt super. Merci :).
kirua relit la description avant de critiquer ce code.
peut etre que ton parser irc est super mais bon je te permet pas de critiquer mon travail.tu compare 2 chose qui n'ont rien a voir.

kirua ce parser se contente de parser le message u channel pour isoler les mots.un peu comme argc argv.pour le reste il est p-e inutile pour ton projet mais pour ce qu'il doit faire ce code est parfait et c'est regit par aucune rfc ca.donc tes remarques a 2 balles tu peux et les garders.a la rigueur tu me dirai d'utiliser les regex je trouverai ca une remarke constructive mais dire que mon code sert a rien.si t'en voi pas l'utilité ca veut pas dire qu'il n'en a pas.
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
23 déc. 2006 à 18:02
Merci Thaeron, ça marche nickel. J'ai écrit un parser IRC personnel (je le trouve plus utile que celui-ci puisqu'il est autonome et encapsulé dans une classe; je l'ai fait conformément à la grammaire EBNF spécifiée dans la RFC IRC 2812 (de mémoire)) et avec les sockets non bloquantes + select, c'est vrmnt super. Merci :).
logant83 Messages postés 90 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 6 mars 2007
23 déc. 2006 à 16:48
nan je me suis mal exprimé je voulait dire que select et recv ensemble font le meme boulot que un simple recv pour ce que je fait
cs_Thaeron Messages postés 202 Date d'inscription vendredi 6 juillet 2001 Statut Membre Dernière intervention 31 octobre 2007
23 déc. 2006 à 16:35
Ca n'a pas trop de sens ce que tu dis. Si tu mets select() tu as forcement ensuite recv() sinon ton select() est inutile. De plus, souvent on a besoin de pouvoir executer autre chose plutot que d'attendre un message donc ne faire que recv() sur un socket bloquant ça ne va pas. D'où le select() et on revient aux posts précédents sur select/thread/fork/ioctlsocket/fcntl
logant83 Messages postés 90 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 6 mars 2007
23 déc. 2006 à 16:02
moi pour ma par j'utilise un recv() avec socket blockante, je trouve sa plus pratique et on perd pas de temps, j'ai essayé select(); et je suis pas convaincu car c bcp de temps perdu alors que recv(); fait le meme boulot avec simplement 2/3 ligne :)
le seul truc c de parser avant pour éviter un flu de paquet qui pourrait donné des erreurs à l'arrivé.
cs_Thaeron Messages postés 202 Date d'inscription vendredi 6 juillet 2001 Statut Membre Dernière intervention 31 octobre 2007
12 déc. 2006 à 22:01
Kirua oui select() ne s'utilise que sur un socket bloquant sinon ya pas d'intêret. Les points négatifs de select() sont nombreux (ou presque) : c'est plus lent (meme si c'est rapide), tu ne peux pas mettre une infinité de descripteur dans un fd_set (sous windows 98 c'était limité à 64 je crois, xp je ne sais pas, et linux 1024 par défaut), donc faut créer plusieurs fd_set ce qui multiplie les appels à select() (mais bon c'est plutot dans le cas d'un serveur que c'est génant, pour un client ya peu de sockets quand meme).
Pour les sockets non bloquants je ne pourrais pas les défendre parce que je n'aime pas ça du tout : recv() renvoie -1 tout le temps (sauf s'il ya des données) et ne détecte plus si la connexion est fermée de l'autre côté.
Après ça dépend des gouts, y'en a qui preferent utiliser un thread rien que pour recv() sans select et avec un socket bloquant.

bustarhy > je voudrais bien partager le code de mon bot ici, mais il ne répond a aucun critère pour être partagé sur un site comme cppfrance vu que la masse de sources est assez importante (presque 30 000 lignes de code dans la version actuelle) et qu'il n'y a aucun commentaire. Donc les sources restent au chaud sur le site, tant pis.
bustarhy Messages postés 13 Date d'inscription mardi 20 avril 2004 Statut Membre Dernière intervention 7 janvier 2007
12 déc. 2006 à 21:07
thaeron bien sur que j'ai plus precis en terme de code.mais je garde ca privé.je pense que le partage a des limites.je partage mes connaissances,mais je distribie pas mon travail.tout travail merite salaire LOL.non je plaisante, mais bon j'ai été a l'université et j'ai vu pas mal de mec chopé des codes ici et se tapper des bonnes notes apres alors que les mecs avait rien fait.donc je me limite a donner des pistes.apres celui qui veut un code parfait ben le fait lui meme.certains diront que c'est mechant mais en tout cas ca leurs fera un grand bien de cherché par eux-méme.si la lecture des codes se limiterai aux membres(membres actifs) et des gens qui me permettent d'ameliorer mes codes je distribuerai mes projets entier,mais bon le problemes reste que c'est une infime partis des lecteurs sur cppfrance.le reste c'est que des copieurs lol.en tou cas merci de tes remarques elle me sont bien utiles.continuer ca me fait plasir des gens qui codes "irc",je me sentais un peu seul lol.
et pour le recv j'ai remarqué ca sur mon bot aujourdh'ui et je travail dessus.j'ai trouvé ce probleme interessant et je travail dessus.
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
12 déc. 2006 à 20:56
Thaeron, j'ai trouvé ça entre temps. Question: select, ça fonctionne aussi sur les sockets bloquantes? J'ai l'impression que oui en lisant la doc, mais alors les sockets non bloquantes ne servent à rien: je peux tjs vérifier a priori si je dois faire un recv en étant certain qu'il ne bloque pas.
cs_Thaeron Messages postés 202 Date d'inscription vendredi 6 juillet 2001 Statut Membre Dernière intervention 31 octobre 2007
12 déc. 2006 à 18:00
Il manque un free() dans la fonction parseline (sur buffer).
Kirua > pour utiliser les sockets en non bloquants soit ioctlsocket() (sous windows)comme l'a dit BUSTARHY soit fcntl() (sous linux), soit select() est ton ami.
En revanche lorsque tu utilises ioctlsocket() ou fcntl(), recv() se comporte très différement (ce qui pose souvent problème).

Petite remarque : c'est peut-être pas mal de parser un peu plus la requête en mettant dans une structure qui contiendrait une chaîne pour la destination, le pseudo de l'envoyeur, son ident, son host, le mask complet et ensuite chaque "mot" de la commande et un entier donnant le nombre de "mots". (c'est ce que j'ai fait sur mon bot dont les sources absolument non commentées sont dispo sur http://syndrome.sagwin.org )

Une autre petite remarque : l'un des gros problème aussi est lorsqu'on fait recv() sur un paquet d'octets (et non octet par octet) on peut avoir plusieurs requêtes (et parfois la dernière n'est pas complète) dans un seul buffer, et faut donc pré-parser le buffer pour séparer chaque requête.
Si tu continues sur ta lancée de proposer des parsers pour bots IRC BUSTARHY, ça serait peut-être pas mal de proposer ça.
Bonne continuation =)
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
9 déc. 2006 à 15:33
Ah, ok, c'est juste une option de la socket que j'utilise, c'est pas un module différent de winsock. Pour le reste, ça reste pareil? A priori, pour cette question, répondez juste oui ou non, et si c'est non j'essayerai de me débrouiller ;) Merci en tout cas!
bustarhy Messages postés 13 Date d'inscription mardi 20 avril 2004 Statut Membre Dernière intervention 7 janvier 2007
9 déc. 2006 à 15:29
sous windows pour mettre ton sock en non bloquand :
u_long arg; int err;
arg = 1;
err = ioctlsocket( sock, FIONBIO, &arg );
if( err == SOCKET_ERROR )exit(1);
Xenul Messages postés 35 Date d'inscription mardi 8 août 2006 Statut Membre Dernière intervention 28 octobre 2007
9 déc. 2006 à 15:27
Ben perso j'utilise les sock linux, et je met ceci :

timeval _TimeVal;
fd_set _fdSet;

_TimeVal = 0;
_fdset = 0;
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
9 déc. 2006 à 14:59
Comment on peut en utiliser avec winsock. A savoir que, comme je le disais plus haut, j'utilise actuellement winsock en mode bloquant (par défaut), mais j'aimerais passer en mode non bloquant, et je ne vois pas comment (la msdn n'est pas trop mon amie sur ce coup).
Xenul Messages postés 35 Date d'inscription mardi 8 août 2006 Statut Membre Dernière intervention 28 octobre 2007
9 déc. 2006 à 14:56
Gnié ? tu veux savoir quoi a propos des non bloquants ? :p
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
9 déc. 2006 à 13:40
... et pour les sockets non bloquantes? :)
Xenul Messages postés 35 Date d'inscription mardi 8 août 2006 Statut Membre Dernière intervention 28 octobre 2007
8 déc. 2006 à 18:51
Je bosse aussi sur un bot irc, muti serv & co ;p thread de class etc, c'est assez marrant, mais la je bosse que de tps en tps dessus, partiels powaa :(
bustarhy Messages postés 13 Date d'inscription mardi 20 avril 2004 Statut Membre Dernière intervention 7 janvier 2007
8 déc. 2006 à 18:42
merci de tes suggestion.ca fait plaisir de trouver du monde qui s'interesse a irc.je veux bien sur dire en terme de code,pas de chat(sinon c clair yen aurait pas mal ki serai concerné).ca simplifie pas mal la vie ta methode.sinon biento je m'apprete a poster un bon gros projet sur un bot irc.j'espere que ca te fera plaisir et surtout que j'arriverai a le finir.y'a melange de thread et socket non bloquant.assez interessant et rare.par contre je te ments pas je galere pas mal.
en fait t'as un thread et une console.la console te sert a saisir les messages et le thread saisi tout ca et l'envoi o server.pourquoi un thread ? c simple pour faire plusieur server si yen a besoin et avec 1 seule console.pourqoi socket non bloquant? ben pour la communiquer entre la console et le thread.bref un bon gros projet assez costaud.surtout hesite pas a me contacter si t'as des trucs interessant.
Xenul Messages postés 35 Date d'inscription mardi 8 août 2006 Statut Membre Dernière intervention 28 octobre 2007
8 déc. 2006 à 18:31
#include <stdlib.h>
#include
#include <string>

using namespace boost;
using namespace std;

regex pattern(":[^ ]+ ([A-Z]{2,}) .*"); // les parenthéses servent a 'capturer' le texte voulu, ici on veut le type de message irc : quit, join, part, kick etc

string message = ":toto!toto@machin QUIT :Bye"; //Un message de quit irc


int main(void)
{
cmatch match;
if(regex_match(message.c_str(), match, pattern))
{
std::string matche(match[1].first, match[1].second);
printf("This is a %s irc message\n",matche.c_str()); //affichage du type de message

}
}

Pour 'faire' le pattern ya pas de secret, faut se mettre au regex, il y a des sites qui expliquent trés bien, malheureusement je ne trouve plus leurs url :/
wala, j'espére que c'est clair, sinon n'hésite pas a poser des questions ^^
bustarhy Messages postés 13 Date d'inscription mardi 20 avril 2004 Statut Membre Dernière intervention 7 janvier 2007
8 déc. 2006 à 11:49
salut a tous,ce code parse uniquement la partie "vue" sur le channel,cad les messages poster sur le channel ou en priver.
Merci xenul pout tes renseignement.et comment utilise tu les regex dans le domaine d'irc.cela m'intrigue beaucoup.merci de ton attention.
Xenul Messages postés 35 Date d'inscription mardi 8 août 2006 Statut Membre Dernière intervention 28 octobre 2007
7 déc. 2006 à 23:04
Par message irc, tu entend les messages sur les channels ou tous les types de messages irc ?
Pour voir ces types de messages, tu fait un /debug on sous mIRC, ou sous x-chat ya un onglet je ne sais plus où qui ouvre une tite fenétre et output les messages brut :p

sinon il y a aussi la RFC 1459 qui donne la synthaxe des messages (tel que join, quit etc)
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
7 déc. 2006 à 14:01
Bonne initiative, c'est clair que tout qui se frotte aux bots en aura besoin :) Tu pourrais nous donner la "syntaxe" que tu as utilisée? Je veux dire, quelles sont les différentes parties d'un message IRC, comment sont elles définies?

Et au passage, tu utilises quoi pour tes communications sockets? Personnellement, j'ai utilisé des sockets winsock bloquants; ça fait l'affaire pour un bot qui ne fait que réagir à ce qui se passe sur le channel, en "répondant", mais on peut pas écouter tout en se disant qu'à précisément midi on dira à tout le monde d'aller manger ... Il me faudrait des sockets non bloquants? Tu as ça? (il me semble qu'il y a moyen de le faire directement en winsock, mais je sais pas comment).
Xenul Messages postés 35 Date d'inscription mardi 8 août 2006 Statut Membre Dernière intervention 28 octobre 2007
6 déc. 2006 à 15:57
Je n'ait pas testé, cependant cela peut être utile malgrés que je préfére les regex pour ce genre de manipulation, surtout dans le cas de messages irc
Rejoignez-nous