Accueil > > > LES SOCKETS C++ COMME DS MIRC : TOUT EST SIMPLE AVEC LA CLASSE PROSOCK
LES SOCKETS C++ COMME DS MIRC : TOUT EST SIMPLE AVEC LA CLASSE PROSOCK
Information sur la source
Description
voila j'ai essayé de faire une classe pour rendre l'utilisation des sockets en c++ aussi simple que ce qu'on peut faire avec mirc. vous reconnaitrez donc des trucs qui vous sont familiers genre ON_SOCKREAD, ON_SOCKCLOSE etc... pour utiliser la classe, il faut deux choses : une fonction void (ProSock*,int) qui va etre chargée d'intercepter les notifications, et un objet de type ProSocket que vous avez initialisé en faisant CreateProSocket(lenomdevotrefonction). cf les exemples de client et serveur telnet pour comprendre ca. Meme s'il existe un constructeur sans parametre, vous devez toujours pour un seul ProSock utiliser le constructeur avec paramètres pour indiquer le nom de la fonction qui va intercepter les notifications. Sinon elles seront bien envoyées, mais comme personne ne va les intercepter, elles seront perdues. Pour déclarer un tableau de ProSock qui vont tous utiliser la meme fonction SimpleProc, faites : ProSock::pDefaultFunc = SimpleProc ; ProSock tableau[5]; la premiere instruction permet de mettre la fonction par défaut de la classe à SimpleProc, et c'est cette fonction qui est utilisée par le constructeur sans paramètres. Tout ca fonctionne un peu comme la fonction DialogBox dont le dernier paramètre est le nom de la fonction qui est censée intercepter les notifications de Windows. Pour changer le nom de la fonction associée à un ProSocket (celle à qui sont envoyées les notifications), utilisez la méthode SetNewProc(SOCKFUNCT f) de la classe. J'ai commenté le .h donc lisez le pour connaitre les différentes fonctions et notifications. Pour utiliser cette classe ds un de vos projets, 2 possibilités : vous mettez ProSock.cpp et ProSock.h dans votre projet, et ds ProSock.h vous enlevez la ligne '#pragma comment(lib,"ProSock.lib")'. Ou bien vous mettez ProSock.lib avec les autres .lib de base (votre compilateur a bien un répertoire lib, sinon mettez le ds le répertoire courant de votre projet), et vous ajoutez juste ProSock.h Dans visualc++, pour naviguer entre les différents projets, clic droit : Set As Active Project. Ca compile que le projet par défaut donc bon...
Source
- /////////////////////////////////
- // Code d'un client telnet ////
- /////////////////////////////////
-
-
-
- #include <stdio.h>
- #include "../ProSock.h"
-
- bool sortie = false;
-
- void ClientProc(ProSock* s, int message)
- {
- switch(message)
- {
- case ON_SOCKREADLN:
- {
- char text[500];
- s->SockReadln(text,sizeof(text));
- printf("Serveur: %s\n",text);
- break;
- }
- case SOCKREAD_ERROR:
- {
- printf("Erreur lors de la lecture, le socket va etre ferme automatiquement...\n");
- break;
- }
- case ON_SOCKCLOSE:
- {
- printf("Le serveur a ete deconnecte\n");
- sortie = true;
- break;
-
- }
- case ON_SOCKOPEN:
- {
- printf("Vous vous etes connectes avec succes sur %s (port %d)\n",s->Ip(),s->Port());
- break;
- }
- case SOCKOPEN_ERROR:
- {
- printf("Connection sur %s (port %d) impossible\n",s->Ip(),s->Port());
- break;
- }
- case SOCKWRITE_ERROR:
- {
- printf("Erreur lors du write\n");
- break;
- }
- }
- }
-
-
-
- int main()
- {
-
- ProSock ClientTelnet = CreateProSocket(ClientProc);
-
- ClientTelnet.SockOpen("127.0.0.1",23);
-
- while(true)
- {
- char chaine[256];
- int c = 0;
- do
- {
- chaine[c++] = getc(stdin);
- chaine[c] = '\0';
- if (!strcmp(chaine,"exit"))
- {
- ClientTelnet.SockClose();
- goto end;
- }
-
- } while (chaine[c-1] != '\n');
- if (sortie) break;
- ClientTelnet.SockWrite(chaine);
- }
- end:
- system("PAUSE");
- return 0;
- }
-
- /////////////////////////////////
- // Code d'un server telnet ////
- /////////////////////////////////
-
- #include <stdio.h>
- #include "../ProSock.h"
-
- void ServerProc(ProSock* s, int message);
- void ListenProc(ProSock*s, int message);
-
- ProSock SAccept = CreateProSocket(ServerProc);
- ProSock SListen = CreateProSocket(ListenProc);
-
- bool AcceptationOk = false;
-
- bool sortie = false;
-
-
- void ListenProc(ProSock*s, int message)
- {
- switch(message)
- {
- case ON_SOCKLISTEN:
- {
- printf("Un client est arrive\n");
- s->SockAccept(&SAccept);
- // On peut choisir ou nom de fermer une fois que quelqu'un s'est connecté
- s->SockClose();
-
-
- break;
- }
- case SOCKLISTEN_ERROR:
- {
- printf("Impossible d'ecouter le port %d\n",s->Port());
- sortie = true;
- break;
- }
- }
- }
-
- void ServerProc(ProSock* s, int message)
- {
-
- switch(message)
- {
- case ON_SOCKACCEPT:
- {
- printf("Connection acceptee\n");
- AcceptationOk = true;
- break;
- }
- case ON_SOCKREADLN:
- {
- char text[256];
- s->SockReadln(text,sizeof(text));
-
- printf("Client: %s\n",text);
- break;
- }
- case SOCKREAD_ERROR:
- {
- printf("erreur lors de la lecture\n");
- break;
- }
-
- case ON_SOCKCLOSE:
- {
- printf("Fermeture du socket : le client s'est deconnecte\n");
- sortie = true;
- break;
- }
- }
- }
-
-
- int main(int argc, char* argv[])
- {
- SListen.SockListen(23);
-
- // On attent qu'une connection ait été etablie pour pouvoir envoyer des trucs.
- while (true)
- {
- if (AcceptationOk || sortie)
- break;
- Sleep(200);
- }
- while (true)
- {
- char chaine[256];
- int c = 0;
- do
- {
- chaine[c++] = getc(stdin);
- chaine[c] = '\0';
- if (!strcmp(chaine,"exit"))
- {
- SAccept.SockClose();
- goto end;
- }
-
- } while (chaine[c-1] != '\n');
- if (sortie) break;
- SAccept.SockWrite(chaine);
- }
- end:
- system("PAUSE");
- return 0;
- }
/////////////////////////////////
// Code d'un client telnet ////
/////////////////////////////////
#include <stdio.h>
#include "../ProSock.h"
bool sortie = false;
void ClientProc(ProSock* s, int message)
{
switch(message)
{
case ON_SOCKREADLN:
{
char text[500];
s->SockReadln(text,sizeof(text));
printf("Serveur: %s\n",text);
break;
}
case SOCKREAD_ERROR:
{
printf("Erreur lors de la lecture, le socket va etre ferme automatiquement...\n");
break;
}
case ON_SOCKCLOSE:
{
printf("Le serveur a ete deconnecte\n");
sortie = true;
break;
}
case ON_SOCKOPEN:
{
printf("Vous vous etes connectes avec succes sur %s (port %d)\n",s->Ip(),s->Port());
break;
}
case SOCKOPEN_ERROR:
{
printf("Connection sur %s (port %d) impossible\n",s->Ip(),s->Port());
break;
}
case SOCKWRITE_ERROR:
{
printf("Erreur lors du write\n");
break;
}
}
}
int main()
{
ProSock ClientTelnet = CreateProSocket(ClientProc);
ClientTelnet.SockOpen("127.0.0.1",23);
while(true)
{
char chaine[256];
int c = 0;
do
{
chaine[c++] = getc(stdin);
chaine[c] = '\0';
if (!strcmp(chaine,"exit"))
{
ClientTelnet.SockClose();
goto end;
}
} while (chaine[c-1] != '\n');
if (sortie) break;
ClientTelnet.SockWrite(chaine);
}
end:
system("PAUSE");
return 0;
}
/////////////////////////////////
// Code d'un server telnet ////
/////////////////////////////////
#include <stdio.h>
#include "../ProSock.h"
void ServerProc(ProSock* s, int message);
void ListenProc(ProSock*s, int message);
ProSock SAccept = CreateProSocket(ServerProc);
ProSock SListen = CreateProSocket(ListenProc);
bool AcceptationOk = false;
bool sortie = false;
void ListenProc(ProSock*s, int message)
{
switch(message)
{
case ON_SOCKLISTEN:
{
printf("Un client est arrive\n");
s->SockAccept(&SAccept);
// On peut choisir ou nom de fermer une fois que quelqu'un s'est connecté
s->SockClose();
break;
}
case SOCKLISTEN_ERROR:
{
printf("Impossible d'ecouter le port %d\n",s->Port());
sortie = true;
break;
}
}
}
void ServerProc(ProSock* s, int message)
{
switch(message)
{
case ON_SOCKACCEPT:
{
printf("Connection acceptee\n");
AcceptationOk = true;
break;
}
case ON_SOCKREADLN:
{
char text[256];
s->SockReadln(text,sizeof(text));
printf("Client: %s\n",text);
break;
}
case SOCKREAD_ERROR:
{
printf("erreur lors de la lecture\n");
break;
}
case ON_SOCKCLOSE:
{
printf("Fermeture du socket : le client s'est deconnecte\n");
sortie = true;
break;
}
}
}
int main(int argc, char* argv[])
{
SListen.SockListen(23);
// On attent qu'une connection ait été etablie pour pouvoir envoyer des trucs.
while (true)
{
if (AcceptationOk || sortie)
break;
Sleep(200);
}
while (true)
{
char chaine[256];
int c = 0;
do
{
chaine[c++] = getc(stdin);
chaine[c] = '\0';
if (!strcmp(chaine,"exit"))
{
SAccept.SockClose();
goto end;
}
} while (chaine[c-1] != '\n');
if (sortie) break;
SAccept.SockWrite(chaine);
}
end:
system("PAUSE");
return 0;
}
Conclusion
Les notifications : ON_SOCKOPEN : qd on a réussi a se connecter apres une commande SockOpen. SOCKOPEN_ERROR : la connection a échoué. Le socket va être automatiquement fermé. ON_SOCKREAD : qd des données viennent d'etre lues sur le socket. On y accede avec SockRead. ON_SOCKREADLN : qd une ligne vient d'etre lue sur le socket, grace a eventuellement plusieurs recv. On accède a la ligne avec SockReadln (les \r et \n on été enlevés). SOCKREAD_ERROR : erreur lors de la lecture, peut etre qu'a l'autre bout on s'est déconnecté. Le socket va être automatiquement fermé. ON_SOCKWRITE : des données ont été correctement envoyées. SOCKWRITE_ERROR : erreur lors de l'envoi de données. Le socket n'est pas fermé tout seul, a vous de le faire si vous voulez avec SockClose. ON_SOCKLISTEN : votre socket qui écoutait, vient de se rendre compte que quelqu'un veut se connecter. Il faut accepter la connection avec SockAccept(ProSock* unsocketpourlegarsquiveutseconnecter), sinon le socket est fermé. SOCKLISTEN_ERROR : erreur lors de l'écoute. ex: si le port d'écoute est déja pris par une autre application. ON_SOCKACCEPT : l'acceptation aprés le ON_SOCKLISTEN a réussi. Le socket est bien connecté à la personne qui était arrivée. SOCKACCEPT_ERROR : l'acceptation a échoué. ON_SOCKCLOSE : le socket a été fermé par un SockClose de votre part, ou bien il a été fermé automatiquement par une méthode de la classe. SOCKET_ALREADY_USED : si vous essayez de faire par exemple 2 SockConnect de suite avec le meme socket (et que le premier avait réussi...) Vous pouvez utilisez les methodes Ip() et Port() pour connaitre les ip et port de la connection distante. Vous pouvez marquer le socket avec SockMark comme ds mIRC. Ya également un champ State qui peut servir de marque entière, ca peut etre utile ds certains cas. Au fait, les sockets crées vont utiliser TCP...
Merci de signaler les éventuels bugs que vous trouverez, yen reste surement. Un bug qui n'en est pas un : un oubli de break ds un case, ds votre fonction qui intercepte les notifications.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
TECHDAYS PARIS 2010 : SHAREPOINT 2010 POUR LES DéVELOPPEURSTECHDAYS PARIS 2010 : SHAREPOINT 2010 POUR LES DéVELOPPEURS par ROMELARD Fabrice
Animé par: Laurent Cotton Le développement dans SharePoint 2010 passe par plusieurs axes qui seront évoqués dans cette session, mais plus particulièrement les développements simples lié au besoin Business Business Connectivity Services Ce BCS es...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOURTECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOUR par ROMELARD Fabrice
Cette session est la dernière pleinière de ces 3 jours de TechDays Paris 2010. Généralement, cette troisième journée est plus axée sur l'avenir vu par Microsoft. Après un retour sur l'avenir vu par la Science Fiction ou par ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion
Forum
RE : WIN APIRE : WIN API par racpp
Cliquez pour lire la suite par racpp
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|