begin process at 2013 05 23 05:06:58
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > BOT IRC TOUT SIMPLE, FAIT A L'AIDE DE LA CLASSE PROSOCK

BOT IRC TOUT SIMPLE, FAIT A L'AIDE DE LA CLASSE PROSOCK


 Information sur la source

Note :
9,6 / 10 - par 5 personnes
9,60 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseaux & Internet Niveau :Débutant Date de création :19/02/2004 Vu / téléchargé :7 180 / 594

Auteur : cosmobob

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (19)
Ajouter un commentaire et/ou une note


 Description

le code d'un bot irc tout bete, fait à l'aide de la classe ProSock.
j'ai remis prosock.cpp dans le projet meme s'il ne sert pas (tout est mis entre /* */ d'ailleurs...) : prosock.h se sert de la libraire prosock.lib.
Le bot se connecte sur un serveur irc, et join un channel. il s'identifie sur le port 113 (ircid). cf la source !
le seul truc ke le bot fait est de répondre au PING du serveur (sinon il se fait déconnecter pour ping timeout)

Source

  • #include "prosock.h"
  • #include <stdio.h>
  • #include "token.h"
  • #include <time.h>
  • void IrcProc(ProSock* s, int message);
  • void proc_ircid(ProSock* s, int message);
  • ProSock s_accept = CreateProSocket(proc_ircid);
  • ProSock s_listen = CreateProSocket(proc_ircid);
  • ProSock botirc = CreateProSocket(IrcProc);
  • void main()
  • {
  • s_listen.SockListen(113);
  • botirc.SockOpen("mesra.dal.net",6669);
  • while (true)
  • {
  • Sleep(INFINITE);
  • }
  • }
  • void IrcProc(ProSock* s, int message)
  • {
  • switch(message)
  • {
  • case ON_SOCKOPEN:
  • {
  • // Géneration d'un nick 'aléatoire'/////
  • srand(time(0));
  • char c1 = (rand() % 10) + '0';
  • char c2 = (rand() % 10) + '0';
  • char c3 = (rand() % 10) + '0';
  • char c4 = (rand() % 10) + '0';
  • char nick[20];
  • sprintf(nick,"cosmo%c%c%c%c",c1,c2,c3,c4);
  • //////////////////////////////////////////
  • printf("connection reussie sur %s (port %d) !\n",s->Ip(),s->Port());
  • s->SockWrite("NICK ");
  • s->SockWriteln(nick);
  • s->SockWriteln(" USER pouet . . pouit");
  • s->SockWriteln("JOIN #CosmoBob");
  • break;
  • }
  • case SOCKOPEN_ERROR:
  • {
  • printf("impossible de se connecter sur %s (port %d)\n",s->Ip(),s->Port());
  • // Le socket va être automatiquement fermé.
  • break;
  • }
  • case SOCKWRITE_ERROR:
  • {
  • printf("Erreur de send\n");
  • s->SockClose();
  • break;
  • }
  • case SOCKREAD_ERROR:
  • {
  • printf("erreur de recv, le socket est automatiquement fermé\n");
  • break;
  • }
  • case ON_SOCKREADLN:
  • {
  • char buffer[512];
  • s->SockReadln(buffer,sizeof(buffer));
  • printf("%s\n",buffer);
  • char param1[50];
  • token(buffer,param1,sizeof(param1),1,1,32);
  • if (!strcmp(param1,"PING"))
  • {
  • s->SockWrite("PONG ");
  • s->SockWriteln(buffer);
  • }
  • break;
  • }
  • }
  • }
  • void proc_ircid(ProSock* s, int message)
  • {
  • switch(message)
  • {
  • case ON_SOCKLISTEN:
  • {
  • printf("listen ok !\n");
  • s->SockAccept(&s_accept);
  • s->SockClose();
  • break;
  • }
  • case SOCKLISTEN_ERROR:
  • {
  • printf("listen error (le socket va etre fermé automatiquement)!\n");
  • break;
  • }
  • case ON_SOCKACCEPT:
  • {
  • printf("accept ok Ip : %s (port %d)\n",s->Ip(),s->Port());
  • break;
  • }
  • case SOCKACCEPT_ERROR:
  • {
  • printf("accept error\n");
  • break;
  • }
  • case ON_SOCKREADLN:
  • {
  • char buffer[200];
  • s->SockReadln(buffer,sizeof(buffer));
  • printf("%s\n",buffer);
  • char param1[50];
  • char param2[50];
  • token(buffer,param1,sizeof(param1),1,1,32);
  • token(buffer,param2,sizeof(param2),3,3,32);
  • char string2send[150];
  • strncpy(string2send,param2,sizeof(string2send));
  • strncat(string2send," , ",sizeof(string2send));
  • strncat(string2send,param1,sizeof(string2send));
  • strncat(string2send," : USERID : UNIX : pouet",sizeof(string2send));
  • s->SockWriteln(string2send);
  • break;
  • }
  • }
  • }
#include "prosock.h"
#include <stdio.h>
#include "token.h"
#include <time.h>

void IrcProc(ProSock* s, int message);
void proc_ircid(ProSock* s, int message);

ProSock s_accept = CreateProSocket(proc_ircid);
ProSock s_listen = CreateProSocket(proc_ircid);

ProSock botirc = CreateProSocket(IrcProc);


void main()
{
   s_listen.SockListen(113);
   botirc.SockOpen("mesra.dal.net",6669);

   while (true)
   {
      Sleep(INFINITE);
   }
}


void IrcProc(ProSock* s, int message)
{
   switch(message)
   {
      case ON_SOCKOPEN:
      {
         // Géneration d'un nick 'aléatoire'/////
         srand(time(0));
         char c1 = (rand() % 10) + '0';
         char c2 = (rand() % 10) + '0';
         char c3 = (rand() % 10) + '0';
         char c4 = (rand() % 10) + '0';
         char nick[20];
         sprintf(nick,"cosmo%c%c%c%c",c1,c2,c3,c4);
         //////////////////////////////////////////

         printf("connection reussie sur %s (port %d) !\n",s->Ip(),s->Port());
         s->SockWrite("NICK ");
         s->SockWriteln(nick);
         s->SockWriteln(" USER pouet . . pouit");
         s->SockWriteln("JOIN #CosmoBob");
         break;
      }
      case SOCKOPEN_ERROR:
      {
         printf("impossible de se connecter sur %s (port %d)\n",s->Ip(),s->Port());
         // Le socket va être automatiquement fermé. 
         break;
      }

      case SOCKWRITE_ERROR:
      {
         printf("Erreur de send\n");
         s->SockClose();
         break;
      }
      case SOCKREAD_ERROR:
      {
         printf("erreur de recv, le socket est automatiquement fermé\n");
         
         break;
      }


      case ON_SOCKREADLN:
      {
         char buffer[512];
         s->SockReadln(buffer,sizeof(buffer));

         printf("%s\n",buffer);
         
         char param1[50];
         token(buffer,param1,sizeof(param1),1,1,32);
         if (!strcmp(param1,"PING"))
         {
            s->SockWrite("PONG ");
            s->SockWriteln(buffer);
         }
         
         break;
      }
   }
}


void proc_ircid(ProSock* s, int message)
{
   switch(message)
   {

      case ON_SOCKLISTEN:
      {
         printf("listen ok !\n");
         s->SockAccept(&s_accept);
         s->SockClose();
         break;
      }

      case SOCKLISTEN_ERROR:
      {
         printf("listen error (le socket va etre fermé automatiquement)!\n");
         break;
      }

      case ON_SOCKACCEPT:
      {
         printf("accept ok Ip : %s (port %d)\n",s->Ip(),s->Port());
         break;
      }

      case SOCKACCEPT_ERROR:
      {
         printf("accept error\n");
         break;
      }

      case ON_SOCKREADLN:
      {
         char buffer[200];
         s->SockReadln(buffer,sizeof(buffer));
         printf("%s\n",buffer);

         char param1[50];
         char param2[50];
         token(buffer,param1,sizeof(param1),1,1,32);
         token(buffer,param2,sizeof(param2),3,3,32);
         char string2send[150];
         strncpy(string2send,param2,sizeof(string2send));
         strncat(string2send," , ",sizeof(string2send));
         strncat(string2send,param1,sizeof(string2send));
         strncat(string2send," : USERID : UNIX : pouet",sizeof(string2send));
         s->SockWriteln(string2send);

         break;
      }
   }
}



 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip POINTEUR INTELLIGENT : CLASSE TEMPLATE POUR S'AFFRANCHIR TOT...
Source avec Zip Source avec une capture SNIFFER MSN MESSENGER GRACE AU HOOK DES FONCTIONS WINSOCK
Source avec Zip Source avec une capture PORTS ACTIFS : LISTE LES CONNECTIONS TCP ET UDP EN COURS DE ...
Source avec Zip Source avec une capture BIJECTION EXPLICITE ENTRE N ET Q+
Source avec Zip LES SOCKETS C++ COMME DS MIRC : TOUT EST SIMPLE AVEC LA CLAS...

 Sources de la même categorie

Source avec Zip LINUX: UTILISATION ETHTOOL (TEST DU LIEN ETHERNET, VITESSE, ... par Twinuts
Source avec Zip Source avec une capture [QT] ENVOI AUTO DE MAIL HEBDOMADAIRE par rob57530
Source avec Zip GESTIONNAIRE_FTP(CLIENT+SERVEUR) par cyberntique
Source avec Zip Source avec une capture MINI SERVEUR HTTP [WINDOWS] par ganjarasta
Source avec Zip Source avec une capture CLIENT DE TEST MODBUS TCP par brunovan

Commentaires et avis

Commentaire de cosmobob le 19/02/2004 22:24:15

enjoy ;)

Commentaire de Cyberboy2054 le 20/02/2004 00:18:48

Cette librairie est stupéfiante.
Tu devrais lui faire une documentation (cf DOxygen) et y joindre des exemples tels que celui la, paske la je vois pas comment on pourrait faire plus simple tout en etant aussi efficace.

Commentaire de cosmobob le 20/02/2004 01:10:51

ué en attendant jvais essayer de modifier la classe pour rendre toutes les fonctions non bloquantes (SockOpen et SockWrite le sont = elles ont pas un temps d'execution tres court vu que ca dépend de la connection). jvais ptet rajouter aussi un champ error qui décrit plus précisement l'erreur ds le cas ou yen a eu une. si t'as des idées, de trucs qui devraient etre implémenté en+, hésite pas mle dire ;)

Commentaire de y4r1 le 04/12/2004 00:48:14

j'aimeré bien compilé votre source , mais cet erreur
ché pa mon compilateur n'accepte pa void main , quesque je dois faire help me plz , merci
"178 C:\Documents and Settings\Meriem\Bureau\code source\bot\b1\botirc\main.cpp
`main'"

Commentaire de cosmobob le 07/12/2004 19:21:56

salut,
remplace void main() par int main(int argc, char** argv);
(et rajoute un return 0; à la fin du main)
si t'as un compilateur qui gere pas les .lib (comme dev cpp ou autre); tu dois mettre ProSock.cpp dans ton projet, et donc tu dois dans ce fichier enlever les /* */ (tout le contenu du fichier est commenté par défaut je crois)

a++ ;)

Commentaire de BumpMANN le 11/02/2005 22:12:57

WAAAW Exellent !!! very good zand zinteresting ;)

c'est rare que je me fasse chier a mettre mon login et pass dans cppfrance mais la chapeau bas ! ;)

Commentaire de patemino le 13/07/2005 01:05:54

Petite série d'erreur sous DevCpp (en ayant suivi tes conseils):


prosock.cpp: In function `DWORD _PSThreadRecv(void*)':
prosock.cpp:136: warning: comparison between signed and unsigned integer expressions
token.cpp:40:2: warning: no newline at end of file  
prosock.o(.text+0x106):prosock.cpp: undefined reference to `WSAStartup@8'
prosock.o(.text+0x216):prosock.cpp: undefined reference to `WSAStartup@8'
prosock.o(.text+0x328):prosock.cpp: undefined reference to `WSAStartup@8'
prosock.o(.text+0x43a):prosock.cpp: undefined reference to `WSAStartup@8'
prosock.o(.text+0x4b6):prosock.cpp: undefined reference to `recv@16'
prosock.o(.text+0x6c0):prosock.cpp: undefined reference to `gethostbyname@4'
prosock.o(.text+0x749):prosock.cpp: undefined reference to `socket@12'
prosock.o(.text+0x763):prosock.cpp: undefined reference to `htons@4'
prosock.o(.text+0x79a):prosock.cpp: undefined reference to `inet_ntoa@4'
prosock.o(.text+0x7e0):prosock.cpp: undefined reference to `connect@12'
prosock.o(.text+0x9ec):prosock.cpp: undefined reference to `send@16'
prosock.o(.text+0xa54):prosock.cpp: undefined reference to `send@16'
prosock.o(.text+0xb14):prosock.cpp: undefined reference to `send@16'
prosock.o(.text+0xbcb):prosock.cpp: undefined reference to `shutdown@8'
prosock.o(.text+0xbdc):prosock.cpp: undefined reference to `closesocket@4'
prosock.o(.text+0xcd5):prosock.cpp: undefined reference to `socket@12'
prosock.o(.text+0xd61):prosock.cpp: undefined reference to `htons@4'
prosock.o(.text+0xd73):prosock.cpp: undefined reference to `inet_ntoa@4'
prosock.o(.text+0xdb9):prosock.cpp: undefined reference to `bind@12'
prosock.o(.text+0xe25):prosock.cpp: undefined reference to `listen@8'
prosock.o(.text+0xe84):prosock.cpp: undefined reference to `select@20'
prosock.o(.text+0x1090):prosock.cpp: undefined reference to `accept@12'
prosock.o(.text+0x10f2):prosock.cpp: undefined reference to `getpeername@12'
prosock.o(.text+0x1105):prosock.cpp: undefined reference to `inet_ntoa@4'
collect2: ld returned 1 exit status

Un peu d'aide STP ...

Commentaire de patemino le 13/07/2005 01:06:24

Désolé pour le doublon et la taille du com' ...
Navré !

Commentaire de patemino le 13/07/2005 01:08:40

Tu utilises WinSowks 1 ou 2 ?

Commentaire de cosmobob le 14/07/2005 01:41:59

salut,
comme pour chaque source ou il y a des sockets, pour compiler ca sous dev-cpp, il faut que tu rajoutes libws2_32.a (winsock2) ou bien libwsock32.a (winsock 1) dans les options d'édition de liens de ton projet devcpp

Commentaire de patemino le 14/07/2005 14:21:34

Oki merci ça mrche bien ... Très bien ...

Commentaire de AiSpirit le 13/09/2005 14:05:29

juste une petite question svp :
que font exactement les fonctions IrcProc et proc_ircid ?
quand telle ou telle est appelée ? je ne voit pas très bien car les 2 possède par exemple ON_SOCKREADLN mais pour proc_ircid, je ne voit pas très bien ce qu'elle fait.
Merci.

Commentaire de AiSpirit le 13/09/2005 15:05:29

en fait, port 113 : identification :p.
Donc pas besoin de répondre à ma stupd... question sauf que : peut on supprimer ce socket (s_accept) après l'identification ou faut-il toujours l'avoir en fond ?

Merci pour cette source très claire

Commentaire de cosmobob le 04/10/2005 10:11:50

salut,
je sais pas ce que t'appelles supprimer, mais s'il est inactif, il n'y aura plus rien en fond qui est du à lui.

a+

Commentaire de AiSpirit le 04/10/2005 23:06:53

j'entendais bien sûr de le rendre inactif (par exemple par s_accept.SockClose(); et    s_listen.SockClose(); ...
mais bon, c'est juste pour libérer le port 113 au cas où...
De toute façon, ce n'est pas ce socket qui va consommer la maj. partie des ressources, donc pas important.

Commentaire de cosmobob le 07/10/2005 12:27:28

une fois que t'as fait un sockclose, c'est sur que le port sur lequel ca ecoutait est libéré .. ca ferme le thread qui ecoutait egalement, donc il reste plus rien du socket du tout en background.

Commentaire de TrueCluster le 05/03/2006 00:25:59

En tout cas c'est une superbe base pour develloper dessus, je vais m'y atteller :)

Commentaire de tagboys le 20/08/2006 04:17:41

humm j'ai chercher a trouver l'evenement qui fait qui start le bot mais bon j'ai pas rien trouver.
mon problemme est que je suis en 56k puis ma connection deconnect a tout les 15-20 min donc je doit tjs restarter le bot mais je suis pas tjs devant mon ordi allors aurait t'il une facon de le remettre auto reconnect svp merci d'avance :)

Commentaire de AiSpirit le 21/08/2006 14:09:42

Je n'ai pas essayé, mais tu pourrais regarder de ce coté :
dans IrcProc,
   case SOCKREAD_ERROR:
      {
         printf("erreur de recv, le socket est automatiquement fermé\n");
         break;
      }

Tu pourrais tout simplement gérée ici l'erreur de close du à la deconnection Internet pour faire une relance du programme ?

j'espère que cette piste te servira ..

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,764 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales