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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné 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
    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 chevronné 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
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre chevronné 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
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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() ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre chevronné 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
    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.

+ Répondre à la discussion
Cette discussion est résolue.

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, 15h40
  2. Problème d'affichage avec trace
    Par WriteLN dans le forum Flash
    Réponses: 10
    Dernier message: 22/10/2003, 16h59
  3. [Kylix] problème d'affichage
    Par scalvi dans le forum EDI
    Réponses: 1
    Dernier message: 18/06/2003, 10h07
  4. Réponses: 1
    Dernier message: 06/03/2003, 11h57
  5. probléme d'affichage d'une fiche
    Par sb dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 09h43

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