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

Boost C++ Discussion :

Envoi de données entières avec boost::asio


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Par défaut Envoi de données entières avec boost::asio
    Bonjour,

    J'utilise boost::asio, et je voudrais savoir s'il est possible d'envoyer un entier dans une socket tcp. Actuellement j'envoie cet entier sous forme d'une chaîne de caractère, et cela ne me plaît pas. Voici les lignes de codes que j'utilise pour l'instant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    boost::asio::io_service ios;
    std::ostringstream out;
    std::string msg ("Voici mon message ");
    tcp::endpoint endpoint(boost::asio::ip::address::from_string("127.0.0.1"), 1706);
    tcp::socket socket(ios);
    //création de la socket
    socket.connect(endpoint);
    //récupération de la taille du message et mise sous la forme d'une chaîne de caractères
    out << msg.size();
    //envoi de la chaîne
    socket.send(boost::asio::buffer(out.str()));

  2. #2
    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
    Bonjour,

    Je ne vois pas de soucis majeurs dans ta demande !
    Tu as essayer d'utiiser un autre conteneur que std::string ?
    Par exemple, std::vector ou boost::array ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Par défaut
    Je ne souhaite pas transmettre d'entrée ma chaîne, je veux d'abord envoyer sa taille. Pour cela, je voudrais pouvoir transmettre un entier, et non le caractère de la valeure de l'entier.

    pour cela, je pourrais faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    socket.send(boost::asio::buffer(&tailleChaîne, sizeof(tailleChaine));
    Mais existe-t-il une fonctionnalité de boost permettant de n'envoyer qu'un entier ? De façon plus estétique (peut être sans utiliser un boost::asio::buffer).

  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 K-you Voir le message
    Je ne souhaite pas transmettre d'entrée ma chaîne, je veux d'abord envoyer sa taille.
    Bien sûr. C'est d'ailleurs LA procedure à suivre.
    Mais tu peux encore faire mieux : envoyer taille des données et les données d'un seul coup. La taille des données dans un format "fixe", que l'on appelle un header. Et comme ça le réceptionneur connait la taille des donnée à lire derrière.
    Jette un coup d'oeil ici pour plus d'infos sur quelque chose d'assez abouti. La classe tcp_connection permet d'encapsuler toute cette utilisation de header et de gérer les tranferts de très haut.

    A+

    Poukill

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Par défaut
    Le souci est que je réceptionne ces données via un ServeurSocket en Java. Il ne connaît pas les types boost, il sait juste qu'il y a par exemple un entier transmis (taille de la chaine), puis la chaine caractère par caractère dans un buffer de taille fixe.

    Donc ce que je pense qu'il faut faire c'est :
    - Transmettre un entier suivi du buffer de taille fixe N (sauf peut être pour le dernier si la taille de la chaîne n'est pas un multiple de N) qui sera composé de la chaîne à transmettre découpée en morceau de N octets,
    - Et du côté Java une lecture dans la socket de la taille, puis des buffers successifs.

  6. #6
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    les sockets Boost sont juste des interfaces vers l'API des sockets, JAVA n'y verra que du feu vu qu'il ne fera qu'écouter ce qui passe sur la socket.
    Aucun "type Boost" n'y circule.

Discussions similaires

  1. Echange d'objets avec Boost ASIO
    Par CocoLeNain dans le forum Boost
    Réponses: 2
    Dernier message: 08/02/2013, 09h51
  2. Impossible de compiler avec BOOST ASIO
    Par Sentenza31 dans le forum Débuter
    Réponses: 0
    Dernier message: 27/11/2010, 18h52
  3. Réponses: 4
    Dernier message: 04/11/2010, 08h44
  4. Manipulation d'objets socket avec boost::asio
    Par K-you dans le forum Boost
    Réponses: 9
    Dernier message: 14/04/2010, 14h40
  5. Envoie de donnée binaires avec les sockets
    Par java_developper dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 01/06/2007, 11h11

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