begin process at 2012 05 28 07:40:25
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

API

 > 

API + logiciel réseau


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

API + logiciel réseau

mercredi 26 avril 2006 à 13:51:16 | API + logiciel réseau

lolorenzeb

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
mercredi 26 avril 2006 à 15:53:19 | Re : API + logiciel réseau

AlexN

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...
mercredi 26 avril 2006 à 16:09:53 | Re : API + logiciel réseau

ymca2003

Met le corps du main dans un thread à part.
mercredi 26 avril 2006 à 16:13:13 | Re : API + logiciel réseau

Taron31

Membre Club
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)
mercredi 26 avril 2006 à 21:35:22 | Re : API + logiciel réseau

lolorenzeb


Merci pour vos réponses. Je suis en train de tout revoir et je posterai dès que j'aurai du nouveau. A plus



Cette discussion est classée dans : client, socket, hwnd, wc, hinstance


Répondre à ce message

Sujets en rapport avec ce message

Pb sur un ptit bout de prog en DirectX.... [ par Haldwin ] Salut a tous....Voila j'ai deux ptits pbs quand je lance cette appli ci-dessous... (VC++)La première est q'une fois sur deux ma variable hWnd apres le ouvrir une 2eme fenetre avec editbox et tout et tout, c'est possible? [ par Arnaud16022 ] Hello tout le monde!je voudrais mettre un bouton dans une fenetre (ca c'est facile), mais seulement quand on clique dessus un autre fenetre s'ouvre, a [C++]Problème de pointeur ou de liste chainee [ par Arkko ] Bonjour... J'essaye de convertir une liste chainée du site en une liste chainée demandant comme parametre un new par exemple ajouter(new Test);Cela f dev sans MFC [ par c2millet ] Voilà j'essaie de faire un prog sans MFC et je voudrais changer la couleur de text d'un bouton ainsi que ça couleur de fond.Si qqun peu m'aider mercim pb avec le plein écran de DirectX que je veux enlever [ par Diabolus ] Bonjour à tous !Je souhaiterai créer une fenêtre en mode normal et tout ce que j'arrive à faire c'est du plein écran. J'aimerai enlever le plein écran Problème de linker dans programme de base. [ par vith17 ] Bonjour,J'ai tapé le code suivant sous Dev-C++. Lorsque je lance la compilation, il me revoie l'erreur suivante :    [Linker error] undefined referenc Application MDI dans une classe [ par PLUiK ] Salut!Je voudrais savoir s'il est possible de coder uneapplication MDI en C++ (en mettant presque tout le codedans la classe):#include //Code de la cl api window [ par ropars ] Bonjour<br interface en c [ par Med2009 ] salut je suis Mohamed un petit développeur en c et qui désire etre le plus grand développeur dans le monde...


Nos sponsors


Sondage...

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,858 sec (3)

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