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

C++ Discussion :

[Réseau] Envoi et réception de données


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut [Réseau] Envoi et réception de données
    Bonjour à tous,

    Je me pose quelques questions quant au choix technique pour l'envoi et la réception de donnée client/serveur sur un réseau Internet, que ce soit en synchrone ou asynchrone.
    Dans le tuto de khayyam, le choix est porté sur une sérialisation et un envoi "brute" de données sur le réseau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void network_machine::TCP_send(engine_event& e){
    	std::ostringstream archive_stream;
    	boost::archive::text_oarchive archive(archive_stream);
    	archive << e;
    	const std::string &outbound_data = archive_stream.str();
     
    	s_tcp->send(asio::buffer(outbound_data));
    }
    Avec la fonction receive associée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void network_machine::TCP_async_receive(const asio::error_code& e, size_t bytes_received){
    	// let's deserialize the message
    	std::string str_data(&network_buffer[0], network_buffer.size());
    	std::istringstream archive_stream(str_data);
    	boost::archive::text_iarchive archive(archive_stream);
     
    	engine_event ne;
    	archive >> ne;
     
    	// add the event to the received event queue
    	parent->push_received_event(ne);
    }
    Celà pose plusieurs problèmes pour moi. Quelle doit être la taille du buffer pour la réception? Est-on sur de récupérer toutes les données?

    Dans un autre style, l'exemple du chat de boost choisit d'avoir un header avec la taille du message à envoyer...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class chat_message
    {
    public:
      enum { header_length = 4 };
      enum { max_body_length = 512 };
       //....
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // Réception : lecture du header
    boost::asio::async_read(socket_,
            boost::asio::buffer(read_msg_.data(), chat_message::header_length),
            boost::bind(
              &chat_session::handle_read_header, shared_from_this(),
              boost::asio::placeholders::error));
    // puis réception du reste...
    // .........
    Là il faut avouer que c'est nickel. Par contre, tout est fixé à l'avance. Ca laisse peu de place à des messages sérialisés beaucoup plus compliqués possédant des std::map, std::string, std::vector et autres conteneurs dont on ne peut prédire la taille... (on peut tout de même calculer la taille des données, mais contrairement à l'exemple de boost, tout ne serait pas réglé à la compilation)

    En conclusion, faut-il systématiquement envoyer la taille des données que l'on va transmettre suivant un protocole bien établi entre le client et le serveur, ou bien l'envoi plus "freestyle" convient aussi bien dans certains cas?

    Merci pour vos éclaircissements...

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Personnellement, je suis assez partisan du concept <longueur><valeur>

    Cela permet d'abord d'allouer un buffer de réception.
    Cela permet aussi d'assurer la synchronisation emission/réception. En effet, 3 émissions TCP peuvent produire 2 réceptions et l'inverse aussi, c'est à dire que 2 émissions peuvent produire 3 réceptions.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    L'autre solution, sinon, c'est d'avoir un terminateur sur tes messages. Ça impose par contre d'échapper un minimum les données que tu envoies.

  4. #4
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Cela permet aussi d'assurer la synchronisation emission/réception. En effet, 3 émissions TCP peuvent produire 2 réceptions et l'inverse aussi, c'est à dire que 2 émissions peuvent produire 3 réceptions.
    C'est clair, c'est vraiment le principal problème je trouve. On est partisan du même type de fonctionnement. Ce qui m'a fait poser cette question, c'est que Khayyam dans son tuto récupère de manière brute des données sur le réseau et désérialise à la volée. Comment être sûr qu'on a pas récupèrer des octets en plus ou moins? La désérialisation échoue dans ce cas là non? J'ai un gros doute sur le bon fonctionnement de cette architecture
    Citation Envoyé par white_tentacle
    L'autre solution, sinon, c'est d'avoir un terminateur sur tes messages. Ça impose par contre d'échapper un minimum les données que tu envoies.
    C'est effectivement une solution que j'avais utilisé il y a longtemps. Ca me semble moins adapté en général, mais oui j'avais eu de bons résultats!

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Citation Envoyé par poukill Voir le message
    Comment être sûr qu'on a pas récupèrer des octets en plus ou moins?
    C'est la couche d'en-dessous (ici Boost.Asio) qui te garantit ça puisque tu lui demandes de te réveiller après avoir reçu un certains nombre d'octets et pas avant ni après.

    MAT.

  6. #6
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Salut,
    C'est la couche d'en-dessous (ici Boost.Asio) qui te garantit ça puisque tu lui demandes de te réveiller après avoir reçu un certains nombre d'octets et pas avant ni après.
    MAT.
    Là je parlais du cas où justement on n'envoie PAS la taille des données avant les données elles-mêmes!
    Sinon oui, je suis d'accord avec toi dans le cas <longueur><valeur>

  7. #7
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Du coup, je vais rester sur mon idée de <longueur><valeur>.
    Mais par contre, j'aimerai toujours savoir comment la première méthode que j'ai évoquée dans mon post du haut (cf tuto de Khayyam) peut fonctionner correctement??
    Si quelqu'un a la réponse...

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

Discussions similaires

  1. envoi et réception des données via serial port
    Par azert2010 dans le forum C#
    Réponses: 2
    Dernier message: 09/05/2011, 23h53
  2. [MVC] gestion envoie et réception de donnée
    Par lequebecois79 dans le forum Spring Web
    Réponses: 0
    Dernier message: 14/03/2011, 20h35
  3. [AJAX] Envoi et réception de données XML avec AJAX
    Par darontankian dans le forum AJAX
    Réponses: 2
    Dernier message: 05/08/2010, 11h53
  4. [RCP] Envoi et réception des données entre view et window
    Par chiraz86 dans le forum Eclipse Platform
    Réponses: 0
    Dernier message: 25/03/2010, 20h01
  5. Envoi et réception de données : Communication Temps Réel
    Par mehdi_862000 dans le forum VC++ .NET
    Réponses: 8
    Dernier message: 26/05/2008, 14h14

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