Accueil > > > TIM_RESEAU, CLASSES POUR RESEAU COMPLET
TIM_RESEAU, CLASSES POUR RESEAU COMPLET
Information sur la source
Description
Cette source présente la librairie TIM_Reseau basée sur les sockets qui gèrent un réseau à haut niveau (serveur et client multi-thread, protocoles TCP et UDP, template pour faciliter la gestion des données, stockage des messages, gestions des clients etc...). Regarder Doc TIM_Reseau.txt pour plus d'informations. La source est abondamment commentée. Les deux projets client et serveur sont codés sous code::block compilés sous windows. Je laisse le projet code::block pour ceux qui l'aurait. Ces projets illustrent les classes TIM_server et TIM_client par l'exemple d'un chat exploitant les 2 protocoles TCP et UDP ainsi que l'échange de structures de donnés et la prise en charge du réseau en entier. Testez avec plusieurs clients connectés pour voir les capacités et la simplicité de la classe. Je n'ai jamais compilé sous Linux mais je ne pense pas que cela marche.
Source
- /* Exemple de code utilisant TIM_Reseau coté serveur
- Auteur : Williamallas de Total_Immersion */
-
- #include <iostream>
- #include "TIM_Reseau\TIM_Server.h" // header de la classe TIM_Reseau
-
- #define CLIENT_MAX 8
- #define PORT_TCP 54000
- #define PORT_UDP 54001
- #define ID_TYPE_PROFILE 1 // c'est l'id du type contenant la structure Profile,
- // l'id doit être le même pour le serveur et tous les clients
- #define ID_TYPE_TEXT 2
-
- struct Profile // structure contenant le profile d'un client
- {
- char pseudo[25];
- int age;
- };
-
- struct Text // structure contenent un message d'un client
- {
- char txt[200];
- int protocole; // 1 = TCP, 2 = UDP
- };
-
- using namespace std;
-
- /* Prototypes des fonctions */
- void toutInit(TIM_Server & serveur); // initialise le protocole TCP et UDP
- void gestionMessage(TIM_Server & serveur, int id); // récupère et affiche les messages
-
- int main()
- {
- TIM_Server serveur;
- int err;
-
- toutInit(serveur); // // initialise le protocole TCP et UDP
-
- serveur.createNewType(ID_TYPE_PROFILE, 50, sizeof(Profile)); // on crée un type pour les structures Profile
- serveur.createNewType(ID_TYPE_TEXT, 50, sizeof(Text)); // on crée un type pour les structures Text
-
- err = serveur.startListen(PORT_TCP); // on écoute sur le port 54000 et on attend les connections
- if(err != OK){
- cout << "startListen() : " << serveur.printError(err) << endl; // on affiche l'erreur
- system("pause"); exit(0);
- }
- err = serveur.startRecvUdp(PORT_UDP); // on écoute sur le port 54001 par le protocole UDP
- if(err != OK){
- cout << "startRecvUdp() : " << serveur.printError(err) << endl; // on affiche l'erreur
- system("pause"); exit(0);
- }
-
- cout << "Lancemenet du serveur reussie !" << endl << endl;
- bool continu = true;
- int what, id;
- while(continu) // la boucle d'attente des évenements
- {
- err = serveur.waitNewEvent(what, id, INFINITY); // on attend un évenement pendant un temps infinie
- if(err != OK)
- cout << serveur.printError(err) << endl; // si une erreur s'est produite on l'affiche
- else // sinon on traite l'évenement
- {
- Client_Info info; // servant à récupérer les informations d'un client
- switch(what) // l'évenement est identifié par la variable what
- {
- case CONNECTION: // un nouveau client s'est connecté
- serveur.getClientInfo(id, info); // on demande les informations sur ce client, on utilise la structure Client_Info
- cout << "Le client d'id " << id << " s'est connecte." << endl;
- cout << "Informations : " << info.ip << ":" << info.port << endl; // on affiche les informations du client
- break;
-
- case DECONNECTION: // un client s'est déconnecté
- cout << "Le client d'id " << id << " s'est deconnecte." << endl;
- break;
-
- case MESSAGE: // un nouveau message est arrivé, id contient l'id du type du message
- gestionMessage(serveur, id); // récupère et affiche les messages
- break;
- }
- }
- cout << endl;
- }
- return 0;
- }
-
- void toutInit(TIM_Server & serveur)
- {
- if(serveur.init(CLIENT_MAX, true) == OK) // on initilise le module TCP en autorisant les échanges client-client
- cout << "Initialisation de TCP reussie" << endl;
- else{
- cout << "Erreur initialisation de TCP" << endl;
- system("pause");
- exit(0);
- }
-
- if(serveur.initUdp() == OK) // on initilise le module UDP
- cout << "Initialisation de UDP reussie" << endl;
- else{
- cout << "Erreur initialisation de UDP" << endl;
- system("pause");
- exit(0);
- }
- }
-
- void gestionMessage(TIM_Server & serveur, int id) // récupère et affiche les messages
- {
- int idClient, err;
- Profile profile; // pour recevoir le profile des nouveaux clients
- Text txt; // pour recevoir les messages de type Text
- if(id == ID_TYPE_PROFILE) // si le message appartient au type Profile
- {
- err = serveur.recvRecentMessage(profile, id, &idClient); //on recupère le message
- if(err == OK) // si il n'y a pas d'erreur lors de la récupération du message
- {
- cout << "Profile du client d'id " << idClient << endl;
- cout << "Pseudo : " << profile.pseudo << " Age : " << profile.age << endl; // on affiche le profile du client
- }
- else // il y a une erreur
- {
- cout << "Impossible de recuperer le profile du client : " << serveur.printError(err) << endl;
- }
- }
- else if(id == ID_TYPE_TEXT) // le message appartient au type Text
- {
- err = serveur.recvRecentMessage(txt, id, &idClient); //on recupère le message
- if(err == OK) // si il n'y a pas d'erreur lors de la récupération du message
- {
- if(txt.protocole == 2) // le message est arrivé par la voie TCP
- cout << "Le client d'id " << idClient << " ecrit par UDP : " << txt.txt << endl;
- else // le message est arrivé par la voie UDP
- cout << "Le client d'id " << idClient << " ecrit par TCP : " << txt.txt << endl;
- }
- else // il y a une erreur
- {
- cout << "Impossible de recuperer le message du client : " << serveur.printError(err) << endl;
- }
- }
- }
/* Exemple de code utilisant TIM_Reseau coté serveur
Auteur : Williamallas de Total_Immersion */
#include <iostream>
#include "TIM_Reseau\TIM_Server.h" // header de la classe TIM_Reseau
#define CLIENT_MAX 8
#define PORT_TCP 54000
#define PORT_UDP 54001
#define ID_TYPE_PROFILE 1 // c'est l'id du type contenant la structure Profile,
// l'id doit être le même pour le serveur et tous les clients
#define ID_TYPE_TEXT 2
struct Profile // structure contenant le profile d'un client
{
char pseudo[25];
int age;
};
struct Text // structure contenent un message d'un client
{
char txt[200];
int protocole; // 1 = TCP, 2 = UDP
};
using namespace std;
/* Prototypes des fonctions */
void toutInit(TIM_Server & serveur); // initialise le protocole TCP et UDP
void gestionMessage(TIM_Server & serveur, int id); // récupère et affiche les messages
int main()
{
TIM_Server serveur;
int err;
toutInit(serveur); // // initialise le protocole TCP et UDP
serveur.createNewType(ID_TYPE_PROFILE, 50, sizeof(Profile)); // on crée un type pour les structures Profile
serveur.createNewType(ID_TYPE_TEXT, 50, sizeof(Text)); // on crée un type pour les structures Text
err = serveur.startListen(PORT_TCP); // on écoute sur le port 54000 et on attend les connections
if(err != OK){
cout << "startListen() : " << serveur.printError(err) << endl; // on affiche l'erreur
system("pause"); exit(0);
}
err = serveur.startRecvUdp(PORT_UDP); // on écoute sur le port 54001 par le protocole UDP
if(err != OK){
cout << "startRecvUdp() : " << serveur.printError(err) << endl; // on affiche l'erreur
system("pause"); exit(0);
}
cout << "Lancemenet du serveur reussie !" << endl << endl;
bool continu = true;
int what, id;
while(continu) // la boucle d'attente des évenements
{
err = serveur.waitNewEvent(what, id, INFINITY); // on attend un évenement pendant un temps infinie
if(err != OK)
cout << serveur.printError(err) << endl; // si une erreur s'est produite on l'affiche
else // sinon on traite l'évenement
{
Client_Info info; // servant à récupérer les informations d'un client
switch(what) // l'évenement est identifié par la variable what
{
case CONNECTION: // un nouveau client s'est connecté
serveur.getClientInfo(id, info); // on demande les informations sur ce client, on utilise la structure Client_Info
cout << "Le client d'id " << id << " s'est connecte." << endl;
cout << "Informations : " << info.ip << ":" << info.port << endl; // on affiche les informations du client
break;
case DECONNECTION: // un client s'est déconnecté
cout << "Le client d'id " << id << " s'est deconnecte." << endl;
break;
case MESSAGE: // un nouveau message est arrivé, id contient l'id du type du message
gestionMessage(serveur, id); // récupère et affiche les messages
break;
}
}
cout << endl;
}
return 0;
}
void toutInit(TIM_Server & serveur)
{
if(serveur.init(CLIENT_MAX, true) == OK) // on initilise le module TCP en autorisant les échanges client-client
cout << "Initialisation de TCP reussie" << endl;
else{
cout << "Erreur initialisation de TCP" << endl;
system("pause");
exit(0);
}
if(serveur.initUdp() == OK) // on initilise le module UDP
cout << "Initialisation de UDP reussie" << endl;
else{
cout << "Erreur initialisation de UDP" << endl;
system("pause");
exit(0);
}
}
void gestionMessage(TIM_Server & serveur, int id) // récupère et affiche les messages
{
int idClient, err;
Profile profile; // pour recevoir le profile des nouveaux clients
Text txt; // pour recevoir les messages de type Text
if(id == ID_TYPE_PROFILE) // si le message appartient au type Profile
{
err = serveur.recvRecentMessage(profile, id, &idClient); //on recupère le message
if(err == OK) // si il n'y a pas d'erreur lors de la récupération du message
{
cout << "Profile du client d'id " << idClient << endl;
cout << "Pseudo : " << profile.pseudo << " Age : " << profile.age << endl; // on affiche le profile du client
}
else // il y a une erreur
{
cout << "Impossible de recuperer le profile du client : " << serveur.printError(err) << endl;
}
}
else if(id == ID_TYPE_TEXT) // le message appartient au type Text
{
err = serveur.recvRecentMessage(txt, id, &idClient); //on recupère le message
if(err == OK) // si il n'y a pas d'erreur lors de la récupération du message
{
if(txt.protocole == 2) // le message est arrivé par la voie TCP
cout << "Le client d'id " << idClient << " ecrit par UDP : " << txt.txt << endl;
else // le message est arrivé par la voie UDP
cout << "Le client d'id " << idClient << " ecrit par TCP : " << txt.txt << endl;
}
else // il y a une erreur
{
cout << "Impossible de recuperer le message du client : " << serveur.printError(err) << endl;
}
}
}
Conclusion
Pour conclure, cette classe est utilisable dans presque toutes les situations, à utiliser si vous ne voulez pas développer entièrement la partie réseau de votre projet. Si vous réussissez à adapter la librairie pour Linux vous pouvez m'envoyer le code à l'adresse mentionnée à la fin de Doc TIM_Reseau.txt. Si vous avez des questions n'hésitez pas. Merci de me laisser vos commentaires et vos découvertes de bug. Bon code !
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
ouverture de base Access [ par denis ]
salut!voila mon probleme :j'ai cree une dll dans laquelle il y a une ouverture de base access au moyen d'une classe qui dérive de la classe CRecordset
VCplusplus 6 [ par emaskaoui ]
Comment je peux acceder au membre données d'une la classe à partir d'une autre classe? Merci
dll pour asp avec connection odbc [ par denis ]
salut!voila mon probleme :j'ai cree une dll dans laquelle il y a une ouverture de base access au moyen d'une classe qui dérive de la classe CRecordset
Base de donées ADO [ par header ]
Apres avoir importe la dll et tout ce qui faut pour qu'une classe générique de CADORecordBinding soit crée j'ai un problème : lorsque je commence mes
AIDEZ MOI : LE DOWNLOAD AVEC la classe CHTMLVIEW [ par header ]
il me faudrait un topo sur la classe CHtmlViewje ne sais pas comment faire une pause dans un telechargement...................AIDEZ MOI
builder c++ 5 compile pas chez moi [ par ferrari ]
voila j'ai un projet sous builder qui compilej'ai rajouter une classe perso mais lorsque je compile et que j'appelle une methode de ma classe, il me d
Récupérer le Handle de l'appli [ par Stoomm ]
Bonjour,Explication :J'ai une classe D3Dapp qui crée la fenetre.Dans une autre classe (qui va servir a D3Dapp), j'aimerais récupérer le handle de la f
Visual c++ [ par Maxus ]
Salut,j'ai un probleme sous visual c++ lorque j'execute une fonction d'une classe à partir d'une autre...Explication : dans une fenetre, j'ai une list
INSTANCIER UNE CLASSE D'UNE DLL [ par KL ]
Bonjour,J'ai un enorme problème !J'ai créé une DLL avec des classes dedansMaintenant je veux pouvoir importer ces classes dans un prog Win32 et pouvoi
HELP ME C'est quoi une classe ? [ par Oceane ]
salut,j'aurais besoin d'un petit coup de main. Je viens de commencer C++ et oui y un dédut à tout Je m'explique, j'ai un projet à faire pour mon exame
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|