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]Serveur Multithread + CSocket: ASSERT dans sockcore.cpp


Sujet :

MFC

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 7
    Points : 6
    Points
    6
    Par défaut [MFC]Serveur Multithread + CSocket: ASSERT dans sockcore.cpp
    Voila je développe un petit serveur sous visual, le principe est simple:
    J'ai un CSocket "listener" qui écoute un port fixe auquel les clients se connectent.
    Quand ils se connectent (message OnAccept), je crée un nouveau CSocket, je l'active avec le précédent et je le détache du thread courant. Je crée alors un nouveau thread dans lequel j'attache ce CSocket, et dans lequel je capture les évènements du client, ce qui donne

    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
     
    void OnAccept()
    {
       CSocket* sock =  new CSocket;
       Listener.accept(CSocket);
       SOCKET SocketHandle = sock.detach();
       AfxBeginThread(MethodeThread, SocketHandle);
    }
     
    UINT MethodeThread(LPVOID pParam)
    {
       CSocket* sock = new CSocket;
       SOCKET* hsock = static_cast<SOCKET*>(pParam)
       sock.attach(hsock);
    }
    C'est volontairement très simplifié... Donc PAS TOUT LE TEMPS (et c'est bien le problème) j'ai une assertion dans sockcore.cpp, dans la méthode DoCallBack(). Pas mal de monde a eu ce problème (voir sur CodeGuru et autre) et personne n'arrive à le résoudre. J'ai entendu parler d'une histoire de pompe d'éxécution qui ne s'arrêterait pas, enfin c'est pas de mon niveau. Help.[/code]

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Euh... Je ne sais pas si c'est dans le code original, mais dans celui-ci, tu passes au thread un "SOCKET", et tu récupères un "SOCKET *"...

    Mais pour le reste, je ne peux pas te dire... Je n'ai jamais utilisé CSocket avec les listeners, seulement CAsyncSocket...
    (D'ailleurs, je ne savais même pas que les listeners étaient supposés marcher pour CSocket...)
    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.

  3. #3
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    tu peux citer les liens de codeguru ?
    autrement le probleme doit venir effectivement de la pompe a messages.
    les classes MFC CSocket utilisent une fenetre pour les messages internes .
    en mettant le socket client dans un thread client tu tombes dans le probleme evoqué dans la faq:
    http://c.developpez.com/faq/vc/?page...d#WorkerThread

    La solution de ton probleme c'est de ne pas utiliser de thread pour le client tu n'en as pas besoin le systeme de notification par messages suffit....
    voir aussi cette enfilade:
    http://www.developpez.net/forums/vie...866617#1866617
    tu dois creer une classe derivée pour la socket client (voir post cité) pour gérer les messages.


  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    C'était bien évidemment pour illustrer le principe, le code est assez faux en fait!!! Pour répondre à la question "pourquoi un thread?", c'est parce que j'aimerais pouvoir lancer les opérations d'envoi et de réception (qui sont bloquantes en CSocket) sans pour autant figer le serveur.

    Les liens qui me concernent sont:
    sur CodeGuru:
    - un problème identique au mien, non résolu (la solution présentée est celle que j'utilise)
    http://www.codeguru.com/forum/showthread.php?t=73085
    -la même erreur mais je ne comprends rien à ce que le type a fait pour résoudre le problème!
    http://www.codeguru.com/forum/archive/index.php/t-156500.html
    sur CodeProject:
    - ce que je veux faire (bon OK en plus pervers!):
    http://www.codeproject.com/Purgatory/CSocket_Server_App.asp
    et enfin (ce qui me fait dire que ça doit être faisable) sur msdn
    - http://support.microsoft.com/kb/175668/EN-US/

    Voila pourquoi je m'accroche, je suis sur que c'est possible! Merci pour vos réponses.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Bon étant donné l'avis de certains potes... je vais passer aux sockets API. Mais pour ma curiosité perso ça me pose quand même un problème. Merci quand même!

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    la question est de savoir pourquoi tu veux absolument créer un thread pour le client ? (ça fonctionne sans).
    sinon tu peux regarder ce lien socket2 asynchrone +thread :
    http://www.codeguru.com/network/async_socket.html

Discussions similaires

  1. [MFC]fuite dans dllmodul.cpp
    Par VitamineC dans le forum MFC
    Réponses: 4
    Dernier message: 08/05/2006, 12h59
  2. Réponses: 4
    Dernier message: 11/06/2004, 16h27
  3. [MFC] problème avec les insertions dans CComboBox
    Par Joeleclems dans le forum MFC
    Réponses: 12
    Dernier message: 11/06/2004, 15h31
  4. Réponses: 4
    Dernier message: 15/01/2004, 22h53
  5. Réponses: 6
    Dernier message: 14/02/2003, 16h52

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