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 :

Gestion des sockets clients dans une application serveur


Sujet :

MFC

  1. #1
    Membre du Club
    Inscrit en
    Avril 2002
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 48
    Points : 46
    Points
    46
    Par défaut Gestion des sockets clients dans une application serveur
    Bonjour,

    Je suis en train de construire une application server et, lors du OnAccept de mon socket serveur, un nouveau socket client est à chaque fois créé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Void SocketServeur::OnAccept(int nErrorCode)
    {
       CSocket::OnAccept(nErrorCode)
       CClientSocket * pSocket  = new CClientSocket(this);
       if (Accept(*pSocket)   
       {
          pSocket->Init();
          m_connectionList.AddTail(pSocket); //de type CPtrList
       } 
       else
          delete pSocket;
    }
    Ensuite, je reçois correctement des messages de mes clients connectés (onReceive) que je traite en les affichant à l'écran. Et lorsqu'un socket client se ferme, le Onclose du client est bien appelé.
    Enfin, lorsque je ferme mon application, je fais un delete des Sockets clients contenu dans m_connectionList.

    Ma question est la suivante: Si je stocke mes sockets clients dans une liste (m_connectionList) pour une raison évidente de mémoire (celle-ci doit être gérée en cas de déconnection des objets clients ou lors de la fermeture de l'application) le socket serveur s'occupe-t-il seul de la gestion de tous les sockets clients qui se sont connectés à lui (réception des messages, fermeture des connections ...) ? En d'autres termes, dois-je prévoir des routines (sous forme de thread, par exemple) qui, pour chaque client, écouteront si des messages arrivent ou si des connections se défont? Apparemment, le socket serveur fait ça très bien tout seul (puisque OnClose et OnReceive sont bien appelés), mais j'aimerais une confirmation. Et si quelqu'un pouvait me dire où ces sockets sont stockés/gérés dans l'objet serveur, je serais comblé.

    Merci à tous,
    Hugues.


  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
    Points : 17 323
    Points
    17 323
    Par défaut Re: Gestion des sockets clients dans une application serveur
    Citation Envoyé par Depteam1
    Bonjour,

    Je suis en train de construire une application server et, lors du OnAccept de mon socket serveur, un nouveau socket client est à chaque fois créé:
    Ma question est la suivante: Si je stocke mes sockets clients dans une liste (m_connectionList) pour une raison évidente de mémoire (celle-ci doit être gérée en cas de déconnection des objets clients ou lors de la fermeture de l'application) le socket serveur s'occupe-t-il seul de la gestion de tous les sockets clients qui se sont connectés à lui (réception des messages, fermeture des connections ...) ? En d'autres termes, dois-je prévoir des routines (sous forme de thread, par exemple) qui, pour chaque client, écouteront si des messages arrivent ou si des connections se défont? Apparemment, le socket serveur fait ça très bien tout seul (puisque OnClose et OnReceive sont bien appelés), mais j'aimerais une confirmation. Et si quelqu'un pouvait me dire où ces sockets sont stockés/gérés dans l'objet serveur, je serais comblé.

    Merci à tous,
    Hugues.
    la liste doit etre gerée dans les 2 cas sur le message onclose en cas de fermeture du client , ou en cas de fermeture du serveur ( la liste devrait etre vide : on ne devrait pas fermer le serveur si il y a des clients sauf maintenance !).
    si tu utilises la classe CAsyncSocket pas besoin de thread ,la classe crée en interne une fenetre de traitement des messages pour chaque client.
    Note la gestion des sockets avec CAsyncSocket est merdi... à cause justement des fenetres windows ,c'est un restant d heritage du 16 bits...
    je comprends pas ta derniere question.


  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,
    pour repondre a ta question le mecanisme est caché .
    les sockets sont maintenues dans une map faisant partie d'une structure _AFX_SOCK_THREAD_STATE
    obtenue par la fonction non documentée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define _afxSockThreadState AfxGetModuleThreadState()
    exemple sur l'initialisation des sockets par la fonction AfxSocketInit :
    extrait de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;
    	if (pState->m_pmapSocketHandle == NULL)
    	pState->m_pmapSocketHandle = new CMapPtrToPtr;
    	if (pState->m_pmapDeadSockets == NULL)
    	pState->m_pmapDeadSockets = new CMapPtrToPtr;
           if (pState->m_plistSocketNotifications == NULL)
    	pState->m_plistSocketNotifications = new CPtrList;
    voila les objets sockets créés sont maintenus dans la map m_pmapSocketHandle.

    voir aussi la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CAsyncSocket* PASCAL CAsyncSocket::LookupHandle(SOCKET hSocket, BOOL bDead)
    qui permet de recuperer l'objet CAsyncSocket en fonction du hsocket .

    une fonction interessante qui fait l'objet de ma contrarieté sur la gestion des sockets par les MFC :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void PASCAL CAsyncSocket::AttachHandle(
    	SOCKET hSocket, CAsyncSocket* pSocket, BOOL bDead)
    extrait de code ou l'on voit la creation d'une fenetre de traitement des messages.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //................
    CSocketWnd* pWnd = new CSocketWnd;
    pWnd->m_hWnd = NULL;
    if (!pWnd->CreateEx(0, AfxRegisterWndClass(0),
    		_T("Socket Notification Sink"),
    		WS_OVERLAPPED, 0, 0, 0, 0, NULL, NULL))
    	{
    		TRACE0("Warning: unable to create socket notify window!\n");
    			AfxThrowResourceException();
    	}
    //................
    voila c'est plus clair ?


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

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/08/2011, 17h02
  2. Gestion de la barre des tâches Aero dans une application MDI
    Par Franck SORIANO dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 20/06/2011, 11h31
  3. Réponses: 5
    Dernier message: 09/10/2007, 20h49
  4. [C#] Lier des boutons radio dans une application mobile
    Par Loïc56 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 22/04/2005, 13h00

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