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 :

Problème fonction accept() MFC Single Document


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 11
    Par défaut Problème fonction accept() MFC Single Document
    Bonjour à tous,

    J'ai un problème assez embettant que je n'arrive pas à résoudre... Il concerne les sockets...

    Tout d'abord, j'ai créé un serveur en dialog based et un client en MFC, tout fonctionne parfaitement. Par contre, en utilisant le meme code mais avec un serveur en single document, le serveur plante sur la fonction accept() de la socket avec un joli message windows me demandant si je veux envoyer le rapport d'erreur à Microsoft...

    J'ai créé une appli MFC Single Document en cochant la check-box 'use Windows Sockets'.
    Ensuite, j'ai créé une classe Mon Socket qui hérite de CSocket dont voici le 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
     
    void MonSocket::OnAccept(int nErrorCode) 
    {
    	// TODO: Add your specialized code here and/or call the base class
    	CDametestView* frame = (CDametestView*)AfxGetMainWnd();
    	frame->TraiterAccept();
    	CSocket::OnAccept(nErrorCode);
    }
     
    void MonSocket::OnClose(int nErrorCode) 
    {
    	// TODO: Add your specialized code here and/or call the base class
    	CDametestView* frame = (CDametestView*)AfxGetMainWnd();
    	frame->TraiterClose();
    	CSocket::OnClose(nErrorCode);
    }
     
    void MonSocket::OnReceive(int nErrorCode) 
    {
    	// TODO: Add your specialized code here and/or call the base class
    	CDametestView* frame = (CDametestView*)AfxGetMainWnd();
    	frame->TraiterReceive();
    	CSocket::OnReceive(nErrorCode);
    }
    Ensuite, j'implémente mes fonctions indiquées dans la classe C...View de mon appli SDI comme suit :

    Voici le constructeur de la classe C...View :

    Dans ce qui suit, socketEcoute et socketConnexion sont des objets MonSocket (donc qui héritent de CSocket)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CDametestView::CDametestView()
    {
    	// TODO: add construction code here
     
    	socketEcoute.Create(40000);
    	socketEcoute.Listen();
    }
    Et les fonctions qui sont renvoyé par la classe MonSocket lors des traitements OnAccept, OnClose et OnReceive sont les suivantes :

    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
     
    void CDametestView::TraiterAccept()
    {
    	socketEcoute.Accept(socketConnexion, NULL, NULL );
    }
     
     
    void CDametestView::TraiterReceive()
    {
    	CSocketFile fic(&socketConnexion);
    	CArchive ar(&fic, CArchive::load);
    	CString text;
    	ar >> text;
    	AfxMessageBox(text,0,MB_ICONINFORMATION);
    }
     
    void CDametestView::TraiterClose()
    {
    	socketConnexion.Close();
    }
    Lorque je met en marche le serveur puis le client, boum, ca plante et lorsque je passe en mode debug, je vois qu'il bloque à la fonction accept() avec un message "unhandled exception - Access Violation at address 0x0000020"

    Si ce problème est déjà survenu à quelqu'un ou si quelqu'un voit une erreur dans mon code, je suis preneur!

    Merci d'avance
    Laurent.

  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,
    il faut te mettre en debug trace ,attendre l'assertion d'erreur et remonter la pile des appels pour aboutir a la ligne de ton code qui provoque l'erreur .
    ensuite tu nous montre tout ça ,et la on peut dire quelque chose..

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 11
    Par défaut
    J'ai fait la manip, voici l'état de la pile au moment ou ca bloque:

    CDametestView::TraiterAccept() line 111
    MonSocket::OnAccept(int 0) line 44
    CAsyncSocket:oCallBack(unsigned int 1928, long 8) line 538
    CSocket:rocessAuxQueue() line 822
    CSocketWnd::OnSocketNotify(unsigned int 1928, long 8) line 1126
    CWnd::OnWndMsg(unsigned int 883, unsigned int 1928, long 8, long * 0x0012fcc4) line 1815 + 17 bytes
    CWnd::WindowProc(unsigned int 883, unsigned int 1928, long 8) line 1585 + 30 bytes
    AfxCallWndProc(CWnd * 0x00422d30 {CSocketWnd hWnd=0x00050360}, HWND__ * 0x00050360, unsigned int 883, unsigned int 1928, long 8) line 215 + 26 bytes
    AfxWndProc(HWND__ * 0x00050360, unsigned int 883, unsigned int 1928, long 8) line 368
    AfxWndProcBase(HWND__ * 0x00050360, unsigned int 883, unsigned int 1928, long 8) line 220 + 21 bytes
    USER32! 77d18709()
    USER32! 77d187eb()
    USER32! 77d189a5()
    USER32! 77d1bccc()
    CWinThread:umpMessage() line 846
    CWinThread::Run() line 480 + 11 bytes
    CWinApp::Run() line 400
    AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00141f26, int 1) line 49 + 11 bytes
    WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00141f26, int 1) line 30
    WinMainCRTStartup() line 330 + 54 bytes
    KERNEL32! 7c816d4f()

    Le message d'erreur est : "unhandle exception in Dametest.exe : 0xC0000005 : Access Violation

    Laurent

  4. #4
    Membre confirmé Avatar de lenouvo
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 252
    Par défaut
    Au cas où, initialise tes sockets avant de les utiliser, car j'ai déjà remarqué que sans initialisation, les sockets plantent parfois

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 11
    Par défaut
    Salut,

    Pourrais-tu me donner les étapes d'initialisation des sockets stp ?

    Merci d'avance

  6. #6
    Membre confirmé Avatar de lenouvo
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 252
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {
    		AfxMessageBox("erreur AfxWinInit");
    	}
    	// Initialize the AfxSocket
    	AfxSocketInit();

Discussions similaires

  1. Problème : Compter un nombre de documents avec la fonction FSO
    Par Gaetan31 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 02/10/2014, 08h51
  2. Réponses: 2
    Dernier message: 22/08/2013, 12h03
  3. Problème avec les sockets et la fonction accept
    Par projeticq dans le forum Réseau
    Réponses: 6
    Dernier message: 13/04/2007, 11h37
  4. Réponses: 2
    Dernier message: 02/07/2005, 19h14
  5. Gestion de sockets: fonction Accept
    Par keupon dans le forum MFC
    Réponses: 12
    Dernier message: 22/01/2004, 18h48

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