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

MFC Discussion :

[MFC]Exception CArchive


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2003
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 28
    Par défaut [MFC]Exception CArchive
    bonsoir,
    j'ai créé un reseau grace aux CSocketFile et CArchive.
    je voudrais gérer la déconnexion brutale du client
    sur mon serveur j'ai ce bout de code:
    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
    void CNetEngine::Send3D(UINT id, CData* data)
    {
    	if (sockClient[id] != NULL)
    	{
    		/// Envoie de l'id du message
    		/// Recuperer l'exception pour la fermeture précipité du client
    		netArchiveSend[id]->Write(&data->ID,sizeof(int));
    		TRY
    		{
    			netArchiveSend[id]->Flush();
    		}
    		CATCH(CArchiveException, e)
    		{
    			sockClient[id]->Close();
    			delete sockClient[id];
    			sockClient[id] = NULL;
    		}
    		END_CATCH
    	}
    	if (sockClient[id] != NULL)
    	{
    		/// Envoie de l'objet
    		data->Serialize(*netArchiveSend[id]);
    		TRY
    		{
    			netArchiveSend[id]->Flush();
    		}
    		CATCH(CArchiveException, e)
    		{
    			sockClient[id]->Close();
    			delete sockClient[id];
    			sockClient[id] = NULL;
    		}
    		END_CATCH
    	}
    }
    j'utilise la fonction d'envoie dans un timer et voila comme je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void CSPIDView::OnTimer(UINT nIDEvent)
    {
    	.....
    	MaClasse.Send3D(id,&pDoc->Statut);
    	if (MaClasse.GetClient(id) == NULL)
    	{
    		AfxMessageBox("Deconnexion du poste %d",id);
    		MaClasse.CloseSocket(id);
    	}
    	.....
    }
    le probleme est que lorsque je débug, je m appercois que a cette ligne netArchiveSend[id]->Flush(); je rentre dans une exception.

    Ce que je voudrais c'est que si j arrive pas a flush, alors je ferme la socket et libere la mémoire des variables qui y sont associés.

    merci

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    le plus simple etant d'implementer au niveau de la socket client coté serveur la fonction virtuelle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    virtual void OnClose( int nErrorCode );  // classe CAsyncSocket
    si nErrorCode==0 fermeture normal ,sinon perte due a une erreur.
    dans tous les cas tu peux te mettre un booleen au niveau de ta classe client
    postionné a true en cas de fermeture et tester ce flag lors de l'envoi ...


  3. #3
    Membre averti
    Inscrit en
    Avril 2003
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 28
    Par défaut
    ok je vais essayer

  4. #4
    Membre averti
    Inscrit en
    Avril 2003
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 28
    Par défaut
    Bon, j'ai réussi le TRY/CATCH mais maintenant j'en ai un autre:
    donc voila maintenant mon code
    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
    void CNetEngine::Send3D(UINT id, CData* data)
    {
       if (sockClient[id] != NULL)
       {
          /// Envoie de l'id du message
          /// Recuperer l'exception pour la fermeture précipité du client
          netArchiveSend[id]->Write(&data->ID,sizeof(int));
          TRY
          {
             netArchiveSend[id]->Flush();
          }
          CATCH(CFileException, e)
          {
             CloseSocket(id);
          }
          END_CATCH
       }
       if (sockClient[id] != NULL)
       {
          /// Envoie de l'objet
          data->Serialize(*netArchiveSend[id]);
          TRY
          {
             netArchiveSend[id]->Flush();
          }
          CATCH(CFileException, e)
          {
             CloseSocket(id);
          }
          END_CATCH
       }
    }
    dans la fonction CloseSocket, je fais un delete NetArchiveSend et la ca m envoie une autre exception. Je rappelle que lorsque je suis dans cette fonction cela veut dire que le client s'est déconnecté. Il doit bien se passer quelque chose avec le netFile qui fait que le netArchiveSend plante au delete.

    Quelqu'un aurait un idée???

    Bonne soirée

  5. #5
    Membre averti
    Inscrit en
    Avril 2003
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 28
    Par défaut
    il faut faire un netArchiveSend->Abord(); avant de faire le delete.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VC6 et MFC] Exception dans MFC42D.dll
    Par Philippe320 dans le forum MFC
    Réponses: 8
    Dernier message: 09/12/2005, 14h14
  2. Problème - Gestion des exceptions - MFC.
    Par Atomikx dans le forum MFC
    Réponses: 4
    Dernier message: 14/11/2005, 09h38
  3. [MFC] CArchive dans une thread
    Par Kaori dans le forum MFC
    Réponses: 12
    Dernier message: 11/04/2005, 15h26
  4. Réponses: 2
    Dernier message: 14/02/2005, 14h26
  5. [MFC][Exception] portée d'une exception
    Par r0d dans le forum MFC
    Réponses: 7
    Dernier message: 12/01/2005, 15h01

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