API + logiciel réseau

lolorenzeb Messages postés 71 Date d'inscription lundi 24 mai 2004 Statut Membre Dernière intervention 13 septembre 2006 - 26 avril 2006 à 13:51
lolorenzeb Messages postés 71 Date d'inscription lundi 24 mai 2004 Statut Membre Dernière intervention 13 septembre 2006 - 26 avril 2006 à 21:35
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:

-------------------------------------------------------------------
#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:

/*************************************************************
            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

4 réponses

cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
26 avril 2006 à 15:53
Sans parler du coté graphique.
Tu ouvres une socket (serveur) et tu la mets en écoute. Mais où est le code qui envoie quelquechose sur la socket ? ton programme bloque surement vers

client=accept(serveur,(SOCKADDR *)&clientsin,&val);

puisque personne n'envoie rien sur serveur. Non ? Ou alors j'ai mal lu...
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
26 avril 2006 à 16:09
Met le corps du main dans un thread à part.
0
Taron31 Messages postés 199 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 28 février 2008
26 avril 2006 à 16:13
Tu devrais créer un thread et placé la fonction accept() dedans et placer une variable pour signaler une connexion d'un nouveau client (un Event ?)...

___________________
MVS - Most Valuable Student ( Microsoft)
0
lolorenzeb Messages postés 71 Date d'inscription lundi 24 mai 2004 Statut Membre Dernière intervention 13 septembre 2006 2
26 avril 2006 à 21:35
Merci pour vos réponses. Je suis en train de tout revoir et je posterai dès que j'aurai du nouveau. A plus
0
Rejoignez-nous