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 :

CAsyncSocket et Console (pas de OnReceive)


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Par défaut CAsyncSocket et Console (pas de OnReceive)
    Bonjour,

    J'ai fait une appli en mode console Win32 (sous Visual C++ 6.0).
    J'ai ajouté une classe dérivée de CAsyncSocket (que j'utilise dans d'autre programme avec boite de dialogue).
    Lorsque je tente la connexion avec mon application serveur, je vois bien le OnAccept dans l'application serveur après le Connect de mon appli, et ensuite plus rien : je ne passe pas dans OnReceive.
    Alors que j'ai appelé la fonction Receive dans ma boucle principale et je vois bien le message que m'envoie mon application serveur à la connexion.

    Tout se passe comme si mon appli ne recevait pas les messages. Je ne comprends pas pourquoi ?

    Merci d'avance.

  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
    tu as initialisé les MFC ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Par défaut
    Si tu veux parler de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (!AfxSocketInit())
    {
    	AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
    	return FALSE;
    }
    Alors oui je l'ai fait.

  4. #4
    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
    non de ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // Initialise MFC et affiche un message d'erreur en cas d'échec
        if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
        {
            // TODO : modifiez le code d'erreur selon les besoins
            _tprintf(_T("Erreur irrécupérable : l'initialisation MFC a échoué\n"));
            nRetCode = 1;
        }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Par défaut
    oui

  6. #6
    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
    ceci dit je n'ai jamais fait fonctionner les CSockets dans ce sens (pas de détection d'une réception) dans un programme console.
    le problème c'est que les sockets MFC utilisent une fenêtre pour les messages , dans le contexte d'un programme console ça peut être un problème:
    ça l'était pour moi du temps de vc4.2 , la fenêtre socket se retrouvait dans liste des fenêtres en premier plan et bloquait une application qui envoyait des messages DDE.
    ce que tu peux faire pour t'assurer que ton code est valide c'est de l'implémenter rapidement dans un projet boite de dialogue par exemple.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Par défaut
    Mon code fonctionne déjà dans une boite de dialogue.
    Je n'ai fait qu'un copier/coller de ce code.

  8. #8
    Membre habitué
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Par défaut
    Salut,
    Est ce que qqun a trouvé une solution pour faire marcher l'évenement OnReceive dans un simple programme console??....car je suis face au même problème. Je dois écrire une application client simple qui se connecte à un serveur et qui reçoit des messages de ce dernier. J'ai un exemple écrit en MFC qui fonctionne très bien mais c'est sous la forme boîte de dialogue.

    En ce qui concerne mon programme (sous la console), il fonctionne pour se connecter au serveur et lui envoyer des messages mais pas moyen de recevoir des messages par l'intermédiaire de "onReceive" (comme ds les exemples précédents j'utilise la classe CAsyncSocket). Le programme n'entre jamais dans cette routine. Mon programme serveur de son côté n'est pas à mettre en doute, il envoie bien les données, c'est mon programme client qui ne les détecte pas.
    Merçi d'avance pour vos réponses.

  9. #9
    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
    le problème avec un programme console c'est qu'il n'y pas de boucle de messages.
    dans mes programmes consoles j'avais résolu le problème en ajoutant un boucle lors des attentes claviers.
    je commence par récupérer l'adresse de la fenêtre socket:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <afxsock.h>
    #include <AFXPRIV.H>
    #define _afxSockThreadState AfxGetModuleThreadState()
    #define _AFX_SOCK_THREAD_STATE AFX_MODULE_THREAD_STATE
     
    HWND pAfxSocketWnd=NULL;
     
    CAsyncSocket::LookupHandle(m_pSocket->m_hSocket,FALSE);    
     _AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;
     pAfxSocketWnd=pState->m_hSocketWindow;
    dans l'attente clavier:
    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
     
    //............
    int nCpt=0;
     
        do
            {
                if(pAfxSocketWnd)
                {
                    nCpt=0;    
                    while(::PeekMessage(&msg,pAfxSocketWnd,0,0,PM_REMOVE)
                        && nCpt++<100)
                    {
                        ::TranslateMessage(&msg);
                        ::DispatchMessage(&msg);
                    }
                }
                s=WaitForSingleObject(hStdin,1000);
            }while(s==WAIT_TIMEOUT);
    //............

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    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 394
    Par défaut
    Attention, avec un code pareil, tu n'auras pas de consultation des messages pendant que tu tapes une ligne (mais c'est peut-être voulu).
    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.

  11. #11
    Membre habitué
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Par défaut
    Ok merci pour vos réponses, je pense que je vais laisser tomber la classe AsyncSocket dans mon cas. Je vais faire utiliser à la place un thread et un socket classique.

Discussions similaires

  1. HttpWebRequest fonctionne sur une appli console, pas sur une appli Web
    Par hollywood dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 23/04/2009, 14h34
  2. Ctrl -] ne passe pas dans une console avec vim
    Par Celelibi dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 10/03/2006, 13h35
  3. [VS2005] J'ai pas de console :'(
    Par mister3957 dans le forum Visual C++
    Réponses: 12
    Dernier message: 02/02/2006, 10h52
  4. Pas le même clavier en console et en mode graphique
    Par Eusebius dans le forum Matériel
    Réponses: 4
    Dernier message: 05/12/2005, 17h53
  5. [TOMCAT][LOGS]pas d'affichage de trace dans la console
    Par fabszn dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 23/08/2005, 02h28

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