IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

bot irc: problème d'affichage et d'envoie


Sujet :

C++

  1. #1
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut bot irc: problème d'affichage et d'envoie
    Bonsoir,

    J'ai codé un bot irc brouillon, mais j'ai quelques erreurs une dans le code et une autre qui n'est pas vraiment une erreur. La première est que les informations renvoyées par le serveur me sont affiché bizarrement, j'entends par là qu'il ne sont pas affiché comme leur contenu. Par exemple le serveur m'envoie une phrase, je reçois des caractère bizarre et je distingue quelque mots de la phrase (ça me fait ça depuis que je suis passé sous VS 2005). J'ai donc essayé un autre IDE tel que Dev-cpp, seulement il me retourne une erreur qui se trouve dans le winsock2.h .. (:
    Voila pour ce qui est de l'affichage, ce qui est minime.. Mon autre problème est que lorsque je reçois une information venant du serveur je vérifie son contenu, par exemple je vérifie si le message reçu est "PING" et j'envoie "PONG" au serveur pour qu'il sache que je suis toujours connecté et qu'il ne me déconnecte pas. jusque là tout va bien, maintenant j'essaie de détecter un mot dans une phrase et faire en sorte que si celui ci y est, d'envoyer un message sur un salon précis, seulement c'est là que ça coince..

    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
     
    #include <stdio.h>
    #include <string.h>
    #include <string>
    #include <stdlib.h>
    #include <winsock2.h>
    #pragma comment(lib, "ws2_32.lib") 
     
    int main()
    {
    	WSADATA WSAData;
    	WSAStartup(MAKEWORD(2,0), &WSAData);
    	SOCKET sock;
    	SOCKADDR_IN sin;
     
    	char *buffer = new char[255],
    		nick[] = "NICK squared\r\n", 
    		user[] = "USER socketz \"x.com\" \"irc.voila.fr\" :E equal MC squared\r\n",
    		pong[] = "PONG :irc.voila.fr\r\n",
    		join[] = "JOIN #help-scripting\r\n",
    		version[] = "PRIVMSG #help-scripting :testing\r\n";
     
    	sock = socket(AF_INET, SOCK_STREAM, 0);
    	sin.sin_addr.s_addr			= inet_addr("195.101.94.137");
    	sin.sin_family				= AF_INET;
    	sin.sin_port				= htons(6667);
     
    	connect(sock, (SOCKADDR *)&sin, sizeof(sin));
     
    	send(sock,user,strlen(user),0);
    	send(sock,nick,strlen(nick),0);
    	send(sock,join,strlen(join),0);
     
    	while (1) 
    	{
    		memset(buffer,0,sizeof(buffer));
    		recv(sock, buffer, sizeof(buffer), 0);
    		if (buffer) {
    			printf("%s\n",buffer);
    			if (strstr(buffer,"PING")) { send(sock,pong,strlen(pong),0); }
    			/* c'est à cette ligne que mon problème se situe même si aucune erreur m'est retournée*/
    			if (strstr(buffer,"testz")) { send(sock,version,strlen(version),0); }
    		}
    		else {
    			closesocket(sock);
    			WSACleanup();
    			system("PAUSE");
    		}
    	} 
    	return 0;
    }
    Comme je le dis mon code est un brouillon et sale =/
    Je n'utilise pas encore les threads donc j'ai remplacé par une while infinie. Aucune erreur m'est retournée à la compilation et aucune pendant son utilisation alors que je ne reçois pas le message sur le salon.. Et si une erreur m'est renvoyé par le serveur ce qui se pourrait, ben je ne la vois pas dû à cette affichage pourrit =]

    pour mieux comprendre ce dont je parle, pour ce qui est de l'affichage: http://www.picdo.net/Fichiers/fb841f...d9b/erreur.PNG

    [edit]
    mon problème d'affichage est résolu, je vais maintenant pouvoir regarder ce qu'il ne va pas pour mon message de test
    [/edit]

  2. #2
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Bon, afin de vérifier si ça venait de mon code. J'ai testé ma condition avec les mêmes variables dans les mêmes conditions que si le bot était connecté au serveur, et ma condition est bien vérifier donc celui-ci devrait envoyer un message au serveur. J'ai testé l'envoie du message et il marche parfaitement bien. Je ne sais pas du tout quoi faire!

    [edit]
    voici mon code actuel:

    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
     
    #include <stdio.h>
    #include <string.h>
    #include <string>
    #include <stdlib.h>
    #include <winsock2.h>
    #pragma comment(lib, "ws2_32.lib") 
     
    int main()
    {
    	WSADATA WSAData;
    	WSAStartup(MAKEWORD(2,0), &WSAData);
    	SOCKET sock;
    	SOCKADDR_IN sin;
     
    	char *buffer = new char[]; 
    	char nick[] = "NICK squared\r\n", 
    		user[] = "USER socketz \"x.com\" \"irc.voila.fr\" :E equal MC squared\r\n",
    		pong[] = "PONG :irc.voila.fr\r\n",
    		join[] = "JOIN #help-scripting\r\n",
    		version[] = "PRIVMSG #help-scripting :testing\r\n";
    	const char *test="testz";
     
    	sock = socket(AF_INET, SOCK_STREAM, 0);
    	sin.sin_addr.s_addr			= inet_addr("195.101.94.137");
    	sin.sin_family				= AF_INET;
    	sin.sin_port				= htons(6667);
     
    	connect(sock, (SOCKADDR *)&sin, sizeof(sin));
     
    	send(sock,user,strlen(user),0);
    	send(sock,nick,strlen(nick),0);
    	send(sock,join,strlen(join),0);
    	send(sock,version,strlen(version),0);
     
    	while (1) 
    	{
    		memset(buffer,0,sizeof(buffer));
    		recv(sock, buffer, sizeof(buffer), 0);
    		if (buffer) {
    			printf("%s",buffer);
    			if (strstr(buffer,"PING")) { send(sock,pong,strlen(pong),0); }
     
    			else if (strstr(buffer,test)) { send(sock,version,strlen(version),0); }
    		}
    		else {
    			closesocket(sock);
    			WSACleanup();
    			system("PAUSE");
    		}
    	}
    	return 0;
    }

    Le seul moyen pour que le message ne soit pas envoyé c'est que la condition ne soit pas vérifiée car j'ai testé l'envoie du message une fois le bot connecté et aucun problème. Mais ayant testé la condition avec les mêmes paramètres dans les mêmes conditions que s'il était connecté je ne vois pas ce qui change et qui fait que la condition ne serait pas vérifie surtout que j'affiche les informations renvoyées par le serveur.

    J'aurais vraiment besoin d'aide sur ce coup là ! =/
    [/edit]

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Salut,
    1. Le pragma comment ne marche pas sous Dev-C++, moi je l'entourerais de #ifdef _MSC_VER ... #endif.
    2. Le test est toujours vrai (il teste si le pointeur de ton buffer n'est pas NULL, pas si le buffer est vide ou non)
    3. Rajoute un break; juste après le system("pause"), pour sortir du while et terminer le programme.

  4. #4
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Bonjour,

    Pour ta première remarque, je ne l'appliquerais pas parce que je ne développe jamais sous dev-c++. Mais je la prend tout de même en note le jour où cela arrivera. Et pour ta deuxième remarque, quand tu parles de ma condition tu parles de "if (buffer)", si j'ai bien compris ? Enfin je ne comprends pas trop ta deuxième remarque je crois que l'on s'est mal compris. Au cas où, je vais répèter mon problème qui est le suivant: Je vérifie si dans les informations envoyées par le serveur se trouve une mot qui m'importe, donc une chaine de caractère. En premier, je vérifie que lorsque le serveur m'envoie une requête "PING" de lui répondre par "PONG" afin de rester connecter, pour cela tout va bien. Mais lorsque je cherche une autre chaîne de caractère tel qu'il soit cela ne marche pas. Alors que ma première condition quant à elle marche très bien. J'ai testé la deuxième dans les même conditions en passant les mêmes paramètrers à la fonction strstr, et le résultat est concluant. Je ne comprends donc pas pourquoi ça ne marche pas.

    Et pour ce qui est la troisième remarque, c'était un oubli de ma part je l'ai rajouté. Merci de ta réponse, j'attends une autre réponse de votre part pour savoir ce qui cloche, car cela m'ennuie beaucoup.

    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
     
    	while (1) 
    	{
    		memset(buffer,0,sizeof(buffer));
    		recv(sock, buffer, sizeof(buffer), 0);
    		if (buffer) {
    			printf("%s",buffer);
    			if (strstr(buffer,"PING")) { send(sock,pong,strlen(pong),0); }
    			/* c'est cette condition qui ne se réalise pas, alors que je l'ai testé auparavant comme je l'ai dis dans mon post */
    			else if (strstr(buffer,test)) { send(sock,version,strlen(version),0); }
    		}
    		else {
    			closesocket(sock);
    			WSACleanup();
    			system("PAUSE");
    			break;
    		}
    	}

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Ben, on va poser la question du "if(buffer)" autrement.

    Qu'est-il supposé tester, ce "if(buffer)" ?
    Le résultat de recv() ?

  6. #6
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Voila, sauf que comme tu l'as dis il vérifie si mon pointeur est nul ou pas. Donc j'ai remplacé cette condition par "if (*buffer)", ça devrait être mieux ? Pour savoir si mon buffer est vide ou pas, enfin voila. Donc j'ia du nouveau j'ai réussis à compiler avec dev-cpp en mettant dans l'éditeur de lien dans les options du projet la ligne suivante "-lws2_32". Et ça compile sans erreur tout va bien. Mais au résultat, il n'envoie pas le message. Donc je ne vois vraiment pas ce qu'il ne va pas. Et pour se faire j'ai copier/coller dans mon post précédent ma condition qui ne se réalise pas qui est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    			else if (strstr(buffer,"testz")) { send(sock,version,strlen(version),0); }
    Enfin voila, merci de votre aide.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    eh bien, pourtant, je ne vois pas de problème là-dedans...
    Tu envoies bien en minuscules ? strstr() est sensible à la casse...

  8. #8
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Oui, je l'envoie bien en minuscule. Et moi aussi je ne vois aucun problème.. Comme je l'ai dis sans cesse jusque là, je l'ai testé dans les mêmes conditions pour vérifier si ça venait de là et tout marchait parfaitement. Donc je ne vois pas qui peut altérer ma condition lorsque je l'inclus dans ma while. Et pourtant j'affiche le contenu de mon buffer, et donc lors de mes test j'ai pris exactement l'information renvoyée par le serveur et j'ai testé ma condition avec celle-ci. Cela ne devrait rien changer une fois dans la while puisque les informations sont les mêmes. Ca fait longtemps que j'ai remarqué cela et que j'ai cherché sans cesse, mais là je vous avouerais que ça me dépasse. Si vous aviez la moindre petite idée de ce qui peut causer ce comportement, je suis preneur !

    [edit]
    comme je l'avais dis aussi, je me suis posé la question de savoir, si cela venait de l'envoie de mon message. Pour se faire j'ai testé l'envoie de ce message, histoire de voir s'il marchait correctement et tout fonctionne. pour moi cela viendrait de ma condition il n'y a pas d'autre moyen.. Mais à première vu elle est belle est bien correcte!
    [/code]

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Euh... Je ne connais pas le protocole utilisé par IRC, mais ce ne serait pas le privmsg qui est foireux, des fois ?

  10. #10
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Comment ça? que le message ne serait pas envoyé? Ben personnellement je l'ai testé, mais je peux toujours le remplacer par un printf() histoire de voir.

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Non, je suggère qu'en fait il EST envoyé au serveur, mais que le serveur n'en fait pas ce que tu aurais voulu qu'il en fasse...

  12. #12
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Bon, cela vient bien de ma condition j'ai ajouté deux printf() un avant l'envoie du message et un après (on est jamais sûr de rien). Et aucun ne s'affiche lorsque j'envoie le message "testz" pourtant il est bien reçu.

    [edit]
    Ben je ne vois pas pourquoi, il n'en ferait pas ce que je veux qu'il en fasse puisque je le test auparavant notament à l'entrée sur le salon, et tout fonctionne. Cela vient bien de ma condition..
    [/code]

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Tu peux poster ta sortie ?

  14. #14
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    euh, tu entends quoi par sortie ? désolé, de ne pas comprendre tout ce que l'on me dit parfois.. Tu parles de mon application ?

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Non, je parle de ce qu'elle affiche.

  16. #16
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    :AnGes-!000AnGes-@2107420792.org PRIVMSG #help-scripting :testz
    Voila ce qui m'est affiché, et je me suis servis de ça aussi pour tester ma condition..

  17. #17
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Attends: ça t'affiche tout ça ?
    C'est pas normal, je viens de trouver l'erreur : sizeof(buffer) vaut sizeof(char *), donc ça ne PEUT pas avoir reçu tout ça dans le buffer.

    Le conseil du jour: Utilise un #define ou un const int pour définir la taille du buffer, et utilise cette valeur poru tes recv().

  18. #18
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Et si je remplace mon sizeof() par strlen() ? Enfin je vais essayer ça et aussi ton conseil. Je te tiens au courrant =]

  19. #19
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Bon ben voila, j'ai remplacé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *buffer = new char[];
    par
    Et tout marche parfaitement, je te remercie pour ton aide et ta patience !

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Un conseil : sous Visual C++, utilise la macro ARRAYSIZE() au lieu de sizeof : elle te donne la taille d'un tableau en éléments (au lieu de la taille en octets) et surtout, en C++, elle vérifie que tu lui passes bien un tableau et non un pointeur (erreur de compilation en C++ si tu lui passes un pointeur )

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème commande pour un bot Irc en vb
    Par kazylax dans le forum VB.NET
    Réponses: 7
    Dernier message: 14/11/2009, 16h40
  2. Problème d'affichage avec trace
    Par WriteLN dans le forum Flash
    Réponses: 10
    Dernier message: 22/10/2003, 17h59
  3. [Kylix] problème d'affichage
    Par scalvi dans le forum EDI
    Réponses: 1
    Dernier message: 18/06/2003, 11h07
  4. Réponses: 1
    Dernier message: 06/03/2003, 12h57
  5. probléme d'affichage d'une fiche
    Par sb dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 10h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo