Client irc simple avec dev-cpp

Description

Le but de la source est de vous faire une approche de comment utiliser les SOCKETS avec un serveur IRC, peut servir du base à développer , Le PING est gérer simplement.

Source / Exemple :


// DEV-CPP 4.9.9.2 

#include <cstdlib>
#include <iostream>

// Include pour utiliser les sockets

#include <windows.h>
#include <winsock2.h> // Metre -lws2_32 option compilateur 

using namespace std;

DWORD WINAPI Thread(LPVOID lpParameter); // Un Thread pour rester en lecture.
void Send_Line(SOCKET S,char * Texte); // Petite fonction pour envoyer une chaine de caractère.
void Data_Use(char Data); // Fonction pour traiter les données reçus du serveur

SOCKET MySocket; //Notre Socket 
char C; // Caractère buffer

//Pour la fonction Data_Use
int Ping_Detect=0,v=0,Fin_motd=0;
char Pong_Texte[]="PONG :123456789\r\n",Clear_Pong[18];
//

int main(int argc, char *argv[])
{
    // Un Impératif pour Init Winsock
    WSADATA WSAData;
    WSAStartup(MAKEWORD (2,0), &WSAData );
    //

    HOSTENT* HostName; //Pour le Nom de domaine
    char *IpResult;  //Adresse Ip au Format 225.255.255.255

    MySocket = socket(AF_INET,SOCK_STREAM,0); // Init du Socket
  
    char Addr_Serv[]="irc.quakenet.org"; // Adresse du Serveur ou on se connecte OU adresse IP devrait marcher aussi.

    sockaddr_in Sock_in;
    Sock_in.sin_family = AF_INET;   //FAMILLE           
    Sock_in.sin_port = htons(6667); //PORT  
    
    // On cherche ici L'adresse Ip depuis le Nom de domaine
    
    HostName = gethostbyname(Addr_Serv);
    IpResult = inet_ntoa(*((struct in_addr * )HostName->h_addr));
    Sock_in.sin_addr.s_addr = inet_addr(IpResult); //IP
    
    //Rapelle des Infos du serveurs
    
    cout << "Adresse :" << Addr_Serv << endl;
    cout << "Adresse IP Server :" << IpResult << endl;

   //Creaction du Lien 
   
    cout << "Connection...\n" << endl;
    connect(MySocket, (sockaddr *) &Sock_in, sizeof(sockaddr));
    
    //Ici On est connecté.
    
    //Envoi d'une requete
    
    //Ligne 1

     Send_Line(MySocket,"NICK SuperNoyes\r\n");
    
     //Ligne 2
     Send_Line(MySocket,"USER SuperBoye Moi@ccpfrance irc.quakenet.org :Hehe\r\n");

    //Création du Tread de Lecture
    
    DWORD threadID;
    CreateThread(NULL, 0, Thread, NULL, 0, &threadID);
    
    //Creation d'une pause
    
    int pause;
    cin >> pause;
    
    //On ferme le tout
    
    closesocket (MySocket); // Fermeture du socket
    WSACleanup();
    
    system("PAUSE");

    return EXIT_SUCCESS;
}

DWORD WINAPI Thread(LPVOID lpParameter)
{
   while (1) {
         
            //Lecture du caractère  Buffer
            recv(MySocket, &C,1, 0);
            Data_Use(C); 
   }
}

void Send_Line(SOCKET S,char * Texte)
{
     send(S,Texte,strlen(Texte),0);
}

void Data_Use(char Texte)
{

     
     cout << Texte; // Affichage du caractére
     
     //ICI UNE FONCTION FAITE RAPIDEMENT POUR GERER LES REPONSES AU PING.
     
     if (Ping_Detect == 6)
     {
       if (Texte != '\r')
       { 
             Pong_Texte[6+v]=Texte; //Construit la chaine PONG avec les données serveurs           
             v++;        
       }
       else
       {
          cout << "\n" << Pong_Texte << endl; // Affiche la chaîne qu'on envoi forme PONG: ....

          Send_Line(MySocket,Pong_Texte); // Reponse
          
          //RAZ compteur etc..
          Ping_Detect=0;
          v=0;    
          strcpy(Pong_Texte,Clear_Pong);
       }
     }
       
     // Pour detecter les lettres l'une apres l'autre pour PING
     if (Ping_Detect == 5) Ping_Detect=6;
     if (Ping_Detect == 4) Ping_Detect=5;
     if (Ping_Detect == 3 && Texte == 'G') Ping_Detect=4;
     if (Ping_Detect == 2 && Texte == 'N') Ping_Detect=3;
     if (Ping_Detect == 1 && Texte == 'I') Ping_Detect=2;
     if (Texte == 'P') Ping_Detect=1;
     
     // Pour detecter les lettres l'une apres l'autre pour MOTD finit
     if (Fin_motd == 2 && Texte == '6') Fin_motd=3;
     if (Fin_motd == 1 && Texte == '7') Fin_motd=2;
     if (Texte == '3') Fin_motd=1;
     
     if (Fin_motd == 3) 
     {
         Send_Line(MySocket,"JOIN #ESSAY_HEHE\n\r"); // On join un channel
         Fin_motd=0;      
     }
     
      
}

Conclusion :


LIEN DIRECT SI VOUS VOULEZ L'EXECUTABLE
http://pkzm62.free.fr/IRC_Simple.zip

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.