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 :

échange d'objets par socket


Sujet :

MFC

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 3
    Par défaut échange d'objets par socket
    Bonjour à tous.
    Je dispose d'une classe quelconque (disons CMaClasse) sur une application client-serveur. Cette classe est déclarée à la fois sur le client et le serveur, les deux communiquant par sockets de type CAsyncSocket.

    Ma question est la suivante : peut-on envoyer un objet de type CMaClasse d'un poste vers l'autre dans un socket ? les fonctions CAsyncSocket::Send et CAsyncSocket::Receive prennent en paramètre du "const void *". Comment faire pour envoyer du CMaClasse : par cast, par sérialisation, ... ?

  2. #2
    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
    Je dirais par sérialisation en effet.
    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
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    Il faut faire hériter CMaClasse de CAsynckSocket::Send et redéfinir l'événement OnSend
    Voir l'exemple du MSDN
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    CAsyncSocket::OnSend
    Called by the framework to notify the socket that it can now send data by calling the Send member function.
    virtual void OnSend(
       int nErrorCode 
    );
    Parameters
    nErrorCode 
    The most recent error on a socket. The following error codes apply to the OnSend member function: 
    0   The function executed successfully. 
    WSAENETDOWN   The Windows Sockets implementation detected that the network subsystem failed. 
    Remarks
    For more information, see Windows Sockets: Socket Notifications.
    Example
    // CMyAsyncSocket is derived from CAsyncSocket and defines the 
    // following variables:
    //    CString      m_sendBuffer;   //for async send
    //    int      m_nBytesSent;
    //    int      m_nBytesBufferSize;
     
    void CMyAsyncSocket ::OnSend(int nErrorCode)
    {
       while (m_nBytesSent < m_nBytesBufferSize)
       {
          int dwBytes;
     
          if ((dwBytes = Send((LPCTSTR)m_sendBuffer + m_nBytesSent, 
             m_nBytesBufferSize - m_nBytesSent)) == SOCKET_ERROR)
          {
             if (GetLastError() == WSAEWOULDBLOCK) break;
             else
             {
                TCHAR szError[256];
                wsprintf(szError, "Server Socket failed to send: %d", 
                   GetLastError());
                Close();
                AfxMessageBox (szError);
             }
          }
          else
          {
             m_nBytesSent += dwBytes;
          }
       }
       if (m_nBytesSent == m_nBytesBufferSize)
          {
             m_nBytesSent = m_nBytesBufferSize = 0;
             m_sendBuffer = "";
          }
       CAsyncSocket::OnSend(nErrorCode);
    }

  4. #4
    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
    Huh? Mat.M, vous ne parlez pas du tout de la même chose là...

    korkoth demande comment envoyer le contenu d'un objet par socket, et toi tu lui dis comment résoudre les problèmes d'envoi trop gros pour le buffer...
    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.

  5. #5
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    @Medinoc : j'ai pris ce qui semble correspondre dans le MSDN.
    Mais l'intéressé ne nous dit pas si cela convient.
    D'après le MSDN la méthode Send s'appuie en fait sur send() de Winsock donc oui il faut faire un cast...

  6. #6
    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
    Pas de mal, on attend la réponse.
    Par contre:
    1. Pour le CAsyncSocket::Send(), je serais du genre à préférer m_sendBuffer.GetString() à un cast (mais ça nécessite un MFC >= 7)...
    2. Déjà, la notation "systems hungarian" est mauvaise (contrairement à la "apps hungarian"), mais tu pourrais au moins bien la faire: Ta variable s'appelle dwBytes, mais elle est de type int...
    3. Si tu utilises des TCHAR, fais le jusque au bout: wsprintf(szError, _T("blabla %d"), blabla);
      • Et en fait, puisqu'on est sous MFC, il aurait été plus sain d'utiliser une CString et sa fonction membre Format()...
    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.

Discussions similaires

  1. Serialisation d'objet et envoie par socket
    Par alex8276 dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 17/04/2015, 23h18
  2. Communication d'un Objet par socket
    Par Kiisuk dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 29/05/2013, 16h43
  3. Envoyer Objet / Structure par socket TCP
    Par crazy33 dans le forum C++
    Réponses: 5
    Dernier message: 21/11/2010, 20h49
  4. deserialisation d'objet envoyé par socket
    Par rhifay dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 27/09/2008, 14h12
  5. [Socket] Envoi de texte et d'objets par socket
    Par ced dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 05/08/2004, 09h07

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