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