begin process at 2012 05 27 20:58:39
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > TIM_RESEAU, CLASSES POUR RESEAU COMPLET

TIM_RESEAU, CLASSES POUR RESEAU COMPLET


 Information sur la source

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseaux & Internet Classé sous :classe, Réseau Socket, TCP-UDP, Client-Serveur, haut-niveau Niveau :Initié Date de création :04/01/2010 Date de mise à jour :04/01/2010 22:22:07 Vu / téléchargé :3 412 / 238

Auteur : williamallas

Ecrire un message privé
Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note

 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 !

 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 de la même categorie

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
Source avec Zip Source avec une capture SCANIP [ARP / ICMP] par ganjarasta
Source avec Zip Source avec une capture TRACEROUTE [WINPCAP] par ganjarasta
Source avec Zip SERVEUR MULTITHREAD [LINUX/WIN] par nipepsinicolas

 Sources en rapport avec celle ci

Source avec Zip HEAPCOLLECTOR par troctsch
Source avec Zip GSTRING - GESTION DES CHAINES DE CARACTÈRES par Neokript
Source avec Zip Source avec une capture LISTE AVEC LES CLASSES C++ par alberd_m
Source avec Zip MYSTRING, CLASSE TRAITANT DES CHAÎNES DE CARACTÈRES par Noubzor
Source avec Zip (LIB)CONFIGINIPARSER par LiRYc06

Commentaires et avis

Commentaire de ufukendu59 le 20/07/2010 14:03:30

Moi ,j'ai qu'un truc a dire c'est MERCI . Le code est très ,complet beaucoup de choix ,en plus moi j'étais un gros zéros en réseau ,ca va beaucoup m'aider .

10/10 !


Merci encore!!

Commentaire de ufukendu59 le 20/07/2010 14:05:18 10/10

10/10

Commentaire de williamallas le 10/08/2010 12:57:08

Merci beaucoup, content que me source est profité à quelqu'un !
Bonne chance pour la suite.

Commentaire de puje_fr le 22/01/2012 14:14:48 10/10

Je dois dire que c'est tout bonnement une super source!
10/10 sans problèmes
Elle va m'être très utile.
Par contre, dans VS2010, j'ai fait quelques ajustements:

#include "time.h"
#pragma comment (lib, "Ws2_32.lib")

et dans ton prog exemple, VS n'aime pas Text (qui est tendancieux pour lui)

Voilà, merci encore.

Commentaire de williamallas le 26/01/2012 23:13:35

Bien vu !
C'est vrai que j'ai jamais codé sous VS....
En tout cas merci du commentaire !

 Ajouter un commentaire


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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

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,562 sec (4)

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