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

Visual C++ Discussion :

Fermeture de thread/Stopper recvfrom


Sujet :

Visual C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �m�rite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par d�faut Fermeture de thread/Stopper recvfrom
    Bonsoir,

    Le contexte: r�aliser un serveur bootp qui tourne dans un thread.

    Mon soucis est lorque je d�sire terminer le thread.
    1) Lorsque le thread se termine, j'ai une erreur windows 0xc0000005. A ce que je compris, cela provient des variables dynamiques non lib�r�es.
    Pourtant je me suis inspir� de la FAQ pour g�rer cela sous forme d'�v�nements.
    Comment arreter un thread de travail?

    2) Mon deuxi�me soucis est de stopper la fonction recvfrom qui est bloquante.
    J'ai effectu� diverses tentatives mais aucune s'est av�r� fonctionn�es.

    Voici des bouts de code pour illustrer l'affaire:
    (En commentaire, les diff�rentes tentatives que j'ai pu faire)

    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
     
    /*************************************************************************
      erreur: Ferme le socket
     
      Valeur de retour:
     
      15/11/2006
    *************************************************************************/
    void bootps::erreur()
    {
    	/*if(WSAAsyncSelect(bootps_socket, (HWND)m_hThread, 0, FD_CLOSE) != 0){
    		trace("WSAAsyncSelect a echoue\n");
    		int numError = WSAGetLastError();
    	}*/
    /*Le teste echoue...*/
     
    	/*if (WSAEventSelect(bootps_socket, m_hThread, FD_CLOSE) != 0){
    		trace("WSAEventSelect a echoue\n");
    	}*/
    /*Le teste echoue...*/
     
    	if (shutdown(bootps_socket,SD_BOTH) != 0)
    		trace("shutdown a échoue\n");
     
    	if(closesocket(bootps_socket) !=0)
    		trace("Erreur fermeture socket\n");
    	::WSACleanup();
    }
    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
     
    /*************************************************************************
      stopThreadServeur: Stop le thread du serveur bootp.
     
      Valeur de retour:
            true si aucune erreur durant l'initialisation
            false sinon
     
      15/11/2006
    *************************************************************************/
    bool bootps::stopThreadServeur()
    {
    	//Fermer le socket serveur
    	erreur();	
     
    	cout << "Fermeture du thread..." << endl;
     
    	SetEvent(m_hEndThread);
     
    	// attend que le thread soit terminé
    	WaitForSingleObject(m_hWaitThread, INFINITE);
     
    	// fermeture dans handles
    	CloseHandle(m_hEndThread);
    	CloseHandle(m_hWaitThread);
     
    	//Termine la boucle infini du thread
    	//m_flagThread = false;
     
    	//Fermer le socket serveur
    	//erreur();	
     
    	return true;
    }
    Une partie du serveur, notamment l'appel � recvfrom et le moyen de stopper le thread:
    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
     
    while (true)
    {
    		// attente evenement de fin du thread. -> l'objet doit être ‘signalé ‘
    		// WaitForSingleObject  renvoie WAIT_OBJECT_0 si l'objet est signalé.
    		/*if(WaitForSingleObject(m_hEndThread, 0) == WAIT_OBJECT_0)
     
    		{
    			//Liberation des ressources
    			free((struct bootp *)bootp_recv); bootp_recv = NULL;
     
    			// signale l'objet event d'attente et sort.
    			SetEvent(m_hWaitThread);
    			return 0;
    		}*/
     
    		cod_ret = recvfrom(	bootps_socket,
    				(char*)bootp_recv,
    				BUFSIZ,
    				0,
    				(struct sockaddr *)NULL, (int *)NULL);
     
    		// attente evenement de fin du thread. -> l'objet doit être ‘signalé ‘
    		// WaitForSingleObject  renvoie WAIT_OBJECT_0 si l'objet est signalé.
    		if(WaitForSingleObject(m_hEndThread, 0) == WAIT_OBJECT_0)
     
    		{
    			//Liberation des ressources
    			free((struct bootp *)bootp_recv); bootp_recv = NULL;
     
    			// signale l'objet event d'attente et sort.
    			SetEvent(m_hWaitThread);
    			return 0;
    		}
     
    	... //code
    }
    Merci de vos suggestions ou corrections pour rem�dier � cela, je commence � s�cher...

    Bonne soir�e

    Nicolas

  2. #2
    Membre �m�rite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par d�faut
    Donc voici o� j'ai plac� la fonction erreur( comportant le closesocket() ) afin de debloquer le recvfrom() et de lib�rer les ressources suite � la validit� de WaitForSingleObject():
    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
    /*************************************************************************
      stopThreadServeur: Stop le thread du serveur bootp.
     
      Valeur de retour:
    	true si aucune erreur durant l'initialisation
    	false sinon
     
      15/11/2006
    *************************************************************************/
    bool bootps::stopThreadServeur()
    {
    	SetEvent(m_hEndThread);
     
    	//Fermer le socket serveur
    	erreur();	
    
    	// attend que le thread soit termin�
    	WaitForSingleObject(m_hWaitThread, INFINITE);
     
    	return true;
    }
    Malgr� cela, j'ai encore un plantage au moment de quitter l'appli...

    Voici les deux messages d'erreur qui arrivent successivement:
    le premier:
    Nom : Erreur.JPG
Affichages : 114
Taille : 18,3 Ko

    et le second:
    Nom : Erreur_suite.JPG
Affichages : 100
Taille : 21,7 Ko

    Ca pourra peut �tre aider!

  3. #3
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    La premi�re signale qu'il y a eu un d�bordement de buffer, � un certain moment entre le new et le delete (bonne chance pour trouver)...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre �m�rite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par d�faut
    Citation Envoy� par Mat.M
    Le programme console c'est client ou bien serveur ?.
    Cela semble �tre un probl�me de d�passement de pile ( dbgheap.c) ; les processus sont mal arr�t�s ou bien des objets sont mal effac�s
    Le programme console est serveur. A chaque adresse MAC que je recois, j'attribue une adresse IP definie selon un masque.
    Citation Envoy� par Medinoc
    La premi�re signale qu'il y a eu un d�bordement de buffer, � un certain moment entre le new et le delete (bonne chance pour trouver)...
    Hum hum, interessant comme remarque. Cela peut �tre venir de mon buffer de reception dans le recvfrom...Du moins je pense.
    C'est clair que je me gal�re depuis plusieurs heures pour situer le probl�me.

    Bizarrement lorsque j'utilise le deuxi�me param�tre de recvfrom avec une structure d�clar�e statiquement (car je me dis que ca r�soudrait le probl�me de lib�ration des ressources), une erreur se produit au niveau de la r�ception. Ca devrait fonctionner je pense en principe.
    De souvenir quand j'ai essay� je crois que le transtypage en char* ne fonctionnait pas non plus...

    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
     
    struct bootp *bootp_recv = (struct bootp*)malloc(sizeof(struct bootp));
     
    while (true)
    {
    		cod_ret = recvfrom(	bootps_socket,
    				(char*)bootp_recv,
    				BUFSIZ,
    				0,
    				(struct sockaddr *)NULL, (int *)NULL);
     
    		// attente evenement de fin du thread. -> l'objet doit être ‘signalé ‘
    		// WaitForSingleObject  renvoie WAIT_OBJECT_0 si l'objet est signalé.
    		if(WaitForSingleObject(m_hEndThread, 0) == WAIT_OBJECT_0)
     
    		{
    			//Liberation des ressources
    			free((struct bootp *)bootp_recv); bootp_recv = NULL;
     
    			// signale l'objet event d'attente et sort.
    			SetEvent(m_hWaitThread);
    			return 0;
    		}
     
    	... //code
    }
    Voil�

    Bonne journ�e

  5. #5
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Es-tu s�r que ta structure "struct bootp" poss�de bien une taille de BUFSIZ ?
    D'ailleurs, BUFSIZ est une constante standard (ou POSIX), qui ne sert pour des buffers bien pr�cis, il me semble...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre �m�rite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par d�faut
    Citation Envoy� par Medinoc
    Es-tu s�r que ta structure "struct bootp" poss�de bien une taille de BUFSIZ ?
    Avant de lire ton dernier message, j'ai fait ceci suite � ton pr�c�dent poste:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    struct bootp *bootp_recv = (struct bootp*)malloc(2*sizeof(struct bootp));
    Et � partir de ce moment, plus de soucis.

    En fait, sur le r�seau, je ne recevais pas seulement des requ�tes bootp mais aussi DHCP. Les req�tes DHCP encapsulent le bootp donc poss�dent une taille plus grande, d'ou le probleme de d�bordement de buffer comme tu m'as fait part et qui a fait tilt dans mon esprit!

    De plus, je ne suis pas sur que ma structure est de la taille de BUFSIZ, donc je vais v�rifier cela maintenant.

    Surement qu'en faisant ceci, le probl�me serait r�gl�:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct bootp *bootp_recv = (struct bootp*)malloc(sizeof(struct bootp));
    while (true)
    {
    		cod_ret = recvfrom(	bootps_socket,
    				(char*)bootp_recv,
    				sizeof(struct bootp),
    				0,
    				(struct sockaddr *)NULL, (int *)NULL);
    
       ...
    }
    En tout cas merci pour l'id�e!

  7. #7
    Membre �m�rite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par d�faut Fermeture thread: messages d'erreur
    Bonsoir,

    Je suis entrain de terminer un serveur bootp qui tourne dans un thread. Lorsque je d�sire terminer le thread, je ferme d'abord le sochet gr�ce � shutdown() puis closesocket() et j'utilise WaitForSingleObject() avec des "event" pour �tre bien sur que ce thread se termine avant le thread principal.

    Lorsque la console se ferme, j'ai deux messages qui apparaissent successivement, quelles pourraient en �tre les causes car j'ai du mal � cerner o� je me plante dans mon code:

    Le premier:
    Nom : Erreur.JPG
Affichages : 103
Taille : 18,3 Ko

    Le second:
    Nom : Erreur_suite.JPG
Affichages : 116
Taille : 21,7 Ko

    Merci.
    Bonne soir�e

  8. #8
    Expert confirm�
    Avatar de Mat.M
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 537
    D�tails du profil
    Informations personnelles :
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 537
    Par d�faut
    Le programme console c'est client ou bien serveur ?.
    Cela semble �tre un probl�me de d�passement de pile ( dbgheap.c) ; les processus sont mal arr�t�s ou bien des objets sont mal effac�s

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [Thread] Stopper un thread pendant que les autres tournent
    Par NutellaPiou dans le forum Concurrence et multi-thread
    R�ponses: 13
    Dernier message: 30/01/2009, 11h45
  2. [thread] Stopper un thread
    Par poukill dans le forum Threads & Processus
    R�ponses: 6
    Dernier message: 04/12/2008, 17h34
  3. Fermeture de thread impossible
    Par cbegood dans le forum Windows Forms
    R�ponses: 2
    Dernier message: 13/10/2008, 10h28
  4. Fermeture de thread
    Par Racailloux dans le forum MFC
    R�ponses: 7
    Dernier message: 07/08/2007, 14h26
  5. [Thread] Stopper l'ex�cution d'un thread brutalement
    Par Razgriz dans le forum Concurrence et multi-thread
    R�ponses: 7
    Dernier message: 31/01/2007, 19h55

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