Bonjour à tous,
Voila j'avais deja poster dans un précédent sujet mais comme j'ai revu tout mon code cela va etre plus simple de répondre. J'ai donc créer une application réseau (graphique) qui créer une socket et qui se met en écoute en attente d'une connexion.
Mon probleme est que lorsque je clique sur mon bouton pour que l'appli se mette en écoute, la fenetre se fige et ensuite plante. Le problème vient du fait que j'ai une boucle pour actualiser l'affichage dans "WinMain" ce qui est logique, et une autre qui permet au prog d'etre en écoute (dans la procedure "create_connexion"). Donc lorsque le prog se met en écoute il se bloque dans la boucle d'ecoute et l'affichage ne se fait plus et tout plante.
J'ai entendu vaguement parler des "thread" d'ou le ? dans le titre du sujet mais je ne sais pas du tout m'en servir et je ne suis pas sur non plus que cela règle mon problème.
Si quelqu'un a une idée... Merci d'avance et désolé pour le roman :)
Voila mon code:
/****************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 Connexion
hBoutonConnect = CreateWindow("button", "Lancer", WS_CHILD | WS_BORDER, 95, 30, 90, 20, hwnd, 0, hInstance, 0);
ShowWindow(hBoutonConnect, iCmdShow);
//crée un bouton Quitter
hBoutonQuit = CreateWindow("button", "Quitter", WS_CHILD | WS_BORDER, 10, 60, 175, 20, hwnd, 0, hInstance, 0);
ShowWindow(hBoutonQuit, iCmdShow);
//raffraichit la fenetre
UpdateWindow (hwnd);
//---------Boucle d'affichage---------------------
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){
code ........
}
/***************FIN CREATION DE LA FENETRE*****************/
/*********************CLIENT***************************/
void create_connexion(){
int port=0,erreur;
WSADATA wsa;
/* initialisation */
WSAStartup(MAKEWORD(2,0), &wsa);
//variables pour la connexion réseau
SOCKET serveur;
SOCKET client;
SOCKADDR_IN sin;
SOCKADDR_IN clientsin;
/* creation de la socket serveur */
serveur = socket(AF_INET,SOCK_STREAM,0);
if(serveur == INVALID_SOCKET){
MessageBox (NULL, "Impossible de créer la socket", "Client", MB_OK | MB_ICONEXCLAMATION);
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){
MessageBox (NULL, "Impossible d'ouvrir le port", "Client", MB_OK | MB_ICONEXCLAMATION);
exit(-1);
}
/* creation d'une file d'attente de demande de connexion */
listen(serveur,0);
MessageBox (NULL, "Client en écoute", "Client", MB_OK | MB_ICONEXCLAMATION);
int val = sizeof(clientsin);
//---------Boucle d'écoute---------------------
while (client = accept(serveur,(SOCKADDR *)&clientsin,&val)){
/* accepter une connexion */
if(client == INVALID_SOCKET)
MessageBox (NULL, "Erreur de connexion", "Client", MB_OK | MB_ICONEXCLAMATION);
else
MessageBox (NULL, "Serveur connecter", "Client", MB_OK | MB_ICONEXCLAMATION);
/* fonction qui utilise la socket */
traitement(client);
}
}
/*********************FIN CLIENT*************************/
/*********************TRAITEMENT**********************/
void traitement(SOCKET client){
code .......
}
/*********************FIN DU TRAITEMENT*******************/
/************************************************************/
/****CONTROLE DES RETOURS DE MESSAGES DE WINDOWS*****/
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
code .............
}
/***FIN DU CONTROLE DES RETOURS DE MESSAGES DE WINDOWS****/
/************************************************************/