IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques Discussion :

API + appli réseau


Sujet :

Bibliothèques

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 15
    Points : 7
    Points
    7
    Par défaut API + appli réseau
    Bonjour à tous,

    Voila j'ai réalisé deux petites applications simples (client et serveur) en mode console. Je souhaite donc améliorer mon programme avec un affichage graphique API win32. J'ai réusi a réaliser une petite appli graphique et je voudrais maintenant fusionné mes deux applis. J'ai essayé et la le programme plante. Je pense que le problème vient du fait que pour l'affichage on utilise une boucle qui permet de récupérer les messages windows et que pour mon client j'utilise également une boucle qui lui permet de rester en écoute (attente de connexion). Donc les deux boucles se gène mutuellement.

    Je vous donne donc les deux codes séparés.

    D'abord l'appli graphique:

    -------------------------------------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
     #include <windows.h>
    #include <stdio.h>
     
    HWND CreateWnd(HINSTANCE);
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
     
    HWND hwnd; //afficher
    HWND hBoutonAfficher, hBoutonQuit; //boutons
    HWND hEdit; //edit
     
    /****************BOUCLE PRINCIPALE**************************/
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){
     
     
            MSG msg; //récupère les messages de windows
     
            //crée la fenetre
            hwnd = CreateWnd(hInstance);
            ShowWindow (hwnd, iCmdShow);
            //crée un bouton Afficher
            hBoutonAfficher = CreateWindow("button", "Afficher", WS_CHILD | WS_BORDER, 5, 60, 100, 30, hwnd, 0, hInstance, 0);
            ShowWindow(hBoutonAfficher, iCmdShow);
            //crée un bouton Quitter
            hBoutonQuit = CreateWindow("button", "Quitter", WS_CHILD | WS_BORDER, 110, 60, 100, 30, hwnd, 0, hInstance, 0);
            ShowWindow(hBoutonQuit, iCmdShow);
     
            //raffraichit la fenetre
            UpdateWindow (hwnd);
     
         while (GetMessage (&msg, NULL, 0, 0)){
              TranslateMessage (&msg);
              DispatchMessage (&msg);
         }
         return msg.wParam;
    }
    /****************FIN DE LA BOUCLE PRINCIPALE**************************/
     
    /******************CREATION DE LA FENETRE*******************/
    HWND CreateWnd(HINSTANCE hInst){
     
        WNDCLASS     wc;
     
    //définit la classe fenetre
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = NULL;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
    wc.lpszMenuName =  NULL;
    wc.lpszClassName = "MaWinClass";
     
        if(!RegisterClass(&wc)) return FALSE;
     
        //renvoie les données de la fenetre
        return CreateWindow("MaWinClass", "Super appli", WS_OVERLAPPEDWINDOW,
                             CW_USEDEFAULT, CW_USEDEFAULT, 225, 130,
                             NULL, NULL, hInst, NULL);
    }
    /***************FIN CREATION DE LA FENETRE*******************/
     
    /****************CONTROLE DES RETOURS DE MESSAGES DE WINDOWS**************/
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
     
     
        //récupération du message de windows
        switch (message){
     
            //création des fenetres
            case WM_CREATE:
     
                //Créer l'éditeur pour taper les chiffres (Nom, style, taille, position, handle(identificateur) , etc..)
                hEdit = CreateWindow("EDIT", "192", WS_CHILD|WS_VISIBLE|WS_BORDER|ES_CENTER, 50, 30, 70, 20, hwnd, (HMENU)1001, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
                break;
     
     
            case WM_COMMAND:
     
                if((HWND) lParam == hBoutonQuit){
                    if (MessageBox (NULL,"Êtes vous sur de vouloir quitter l'application",
                                            "Super appli", MB_YESNO) == IDYES)
                    {
                        DestroyWindow(hwnd);
                        return 0;
                    }
                }
                else if ((HWND) lParam == hBoutonAfficher){
     
                    // récupération du texte de l'EDIT
                    int LenghtTexte = GetWindowTextLength(hEdit);
                    char* pBuffer = new char[LenghtTexte + 1];
                    GetWindowText(hEdit, pBuffer, LenghtTexte + 1);
     
                    MessageBox (NULL,pBuffer , "Super appli", MB_OK);
     
                    // On libère la mémoire allouée
                    delete[] pBuffer;
                }
     
     
            //--lors du rafraichissement de la fenetre (textes, dessins, ...)
            case WM_PAINT:
                //variables
                HDC hdc; PAINTSTRUCT ps;
                hdc = BeginPaint(hwnd,&ps);    // obtient un handle de contexte de périphérique
     
                // un peu de texte
                SetBkColor(hdc,RGB(255,255,255)); //couleur de fond
                SetTextColor(hdc,RGB(0,0,0)); //couleur du texte
                TextOut(hdc,20,5,"SUPER APPLI GRAPHIQUE",strlen("SUPER APPLI GRAPHIQUE")); //titre de l'application
                TextOut(hdc,7,32,"texte :",strlen("texte :"));
     
                break;
     
     
            //--lors de la destruction de la fenetre fenetre
            case WM_DESTROY:
                PostQuitMessage (0) ;
                return 0 ;
     
        }
     
        return DefWindowProc (hwnd, message, wParam, lParam);
     
    }
    /****************FIN DU CONTROLE DES RETOURS DE MESSAGES DE WINDOWS**************/
    -----------------------------------------------------------------

    Ensuite mon client:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     /************************************************************* 
                LE CLIENT 
    **************************************************************/ 
    #include <stdio.h> 
    #include <winsock2.h> 
    #include <string.h> 
    #include <time.h> 
     
    #pragma comment(lib, "ws2_32.lib") 
     
    #define LG_MAX_REQUETE 1024 
     
    void traitement(SOCKET); 
     
    void main() 
    { 
        int val,port=0,erreur; 
     
        WSADATA wsa; 
        /* initialisation */ 
        WSAStartup(MAKEWORD(2,0), &wsa); 
     
        SOCKET serveur; 
        SOCKET client; 
        SOCKADDR_IN sin; 
        SOCKADDR_IN clientsin; 
        /* saisir la configuration du serveur */ 
        printf("Entrez le numero de port: "); 
        scanf("%d",&port); 
     
        /* creation de la socket serveur */ 
        serveur=socket(AF_INET,SOCK_STREAM,0); 
        if(serveur==INVALID_SOCKET) 
        { 
            perror("erreur de creation de la socket"); 
            exit(-1); 
        } 
        /* configuration de la socket */ 
        sin.sin_addr.s_addr = INADDR_ANY; 
        sin.sin_family = AF_INET; 
        sin.sin_port = htons(port); 
     
        /* attacher le socket au n° de port*/ 
        erreur=bind(serveur,(SOCKADDR *)&sin, sizeof(sin)); 
        if(erreur == INVALID_SOCKET) 
        { 
            perror("bind"); 
            exit(-1); 
        } 
        /* creation d'une file d'attente de demande de connexion */ 
        listen(serveur,0); 
        val=sizeof(clientsin); 
        printf("\n\tClient en ecoute\n"); 
        while(1) 
        {     
            /* accepter une connexion */ 
            client=accept(serveur,(SOCKADDR *)&clientsin,&val); 
            if(client == INVALID_SOCKET) 
            { 
                perror("erreur de connection"); 
                exit(-1); 
            } 
            /* fonction qui utilise la socket */ 
            traitement(client); 
        } 
    } 
    /************************************************************** 
                traitement 
         traite la requete envoyer par le client 
    **************************************************************/ 
    void traitement(SOCKET client) 
    { 
        int lg,comparaison; 
        char reponse[LG_MAX_REQUETE];
        /* attendre la reception d'une requete sur la socket "client" */ 
        lg=recv(client,reponse,LG_MAX_REQUETE,0); 
        reponse[lg]='\0'; 
        comparaison=strcmp(reponse,"arret"); 
        if(comparaison==0) 
        { 
            system("shutdown -s");
        } 
        comparaison=strcmp(reponse,"redemarrage"); 
        if(comparaison==0) 
        { 
            system("shutdown -r"); 
        } 
        comparaison=strcmp(reponse,"fermeture_session"); 
        if(comparaison==0) 
        { 
            system("shutdown -l");
        } 
        lg=strlen(reponse); 
        /* envoyer une requete sur la socket "client" */ 
        send(client,reponse,lg,0); 
    }
    -------------------------------------------------------

    Voila si quelqu'un a une petite piste ou une solution a me proposé je vous en serait très reconnaissant. Je débute en API et je galère un peu. Merci d'avance

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut


    Qu'est ce qui se passe en réalité ?

  3. #3
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    lol, j'ai pas reussit a trouver le boucle de ta partie graphique... :'(

    mais, ne pourrait tun pas fusionner les deux boucles?

    tu appelle ta gestion des message, puis ta gestion des sockets, et ainsi de suite?

    c une idée, je sait pas si ca marche....

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Ceci est le forum C++.
    Ton code n'est même pas du C++ et tes questions n'ont rien à voir avec un langage de programmation donné mais uniquement avec une API spécifique.
    Boost ftw

Discussions similaires

  1. Chargement de la carte Google Maps API avec réseau mobile
    Par wataiso dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 20/12/2012, 17h32
  2. API / DLL réseau ?
    Par davidlaverda dans le forum Windows
    Réponses: 1
    Dernier message: 29/04/2008, 22h03
  3. [2.0] Modifier le niveau de sécurité pour une appli réseau
    Par Cereal123 dans le forum Framework .NET
    Réponses: 1
    Dernier message: 30/05/2007, 15h28
  4. Réponses: 10
    Dernier message: 09/11/2006, 15h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo