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 :

Concaténation de plusieurs variables de différent type.


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 5
    Par défaut Concaténation de plusieurs variables de différent type.
    Bonjour,

    Depuis quelques jours je me suis penché sur les socket afin de regarder comment tout sa fonctionne.
    Le problème que je rencontre viens au moment de l'envoie/réception de paquets différent d'un simple string.
    Je souhaite envoyé des paquet sous la forme suivante:
    http://www.assembla.com/code/pommo/s...eur.PNG?rev=57
    En envoie on fait un paquet avec toutes les données (header+data).
    En réception on lit le header en premier (qui a la même structure a chaque fois) afin de savoir:
    • Le type de packet: pour savoir le type et l'ordre des donnée envoyé
    • La taille du packet: si un string est envoyé, sa taille varie, la taille a lire sera donc variable.

    puis on lit les data suivant le header.

    J'ai penser à utiliser des struct au début, mais sa risque d'être assez lourd niveau code si je dois avoir un struct / type de paquet (dans le cas d'un grand nombre de paquets différents)

    La fonction send() et recv() des socket prennent en paramètre pour le buffer, un pointeur de type char, et la taille des données a envoyé/lire.

    Je cherche donc a partir d'un pointeur char:
    char * buffer =(char*) malloc(1024 * sizeof(char));
    • A "écrire" des int/short/float... dans ce buffer
      Par exemple:
      ecrire(buffer,int a); //On écris au début du buffer un entier
      ecrire(buffer+4,int b); //On écris un entier apres le précédent (4 octet plus loin)
      ecrire(buffer+8,float c);//On écris un float après les deux int
    • Et à lire ces information dans le buffer en réception, exemple:
      int a=lire(buffer);
      int b=lire(buffer + 4);
      float c=lire(buffer + 8);


    Voila tout

    Socolin.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 15
    Par défaut
    Ce qu'il te faut ce sont des stream

    Cf : http://www.cplusplus.com/reference/iostream/iostream/

    tu peux insérer ou lire des valeurs de type différents en utilisant directement les opérateurs surchargés << et >> (cf la doc). Ensuite tu peux lire le contenu de ta stream afin de remplir ton buffer de type char* à envoyer.

    Alex

  3. #3
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    Bonjour,

    JoueurLeave JoueurJoin etc sont elles des classes que vous pouvez modifier ?
    si oui alors le mieux est de définir send & receive pour chacune

    Utilisez new char[n] plutôt que malloc, et inutile de multiplier par sizeof(char) car par définition de sizeof cela rendra 1. D'autre part sauf si vous en êtes absolument sure ne présupposez pas que 1024 est suffisant, gérez plutôt un buffer de taille extensible.

    Bien évidemment il y a une autre solution : d'abord calculer le nombre de caractères qui seront envoyés, puis les envoyez directement sans tout réunir dans un buffer unique

    Sinon, qu'elle est la question ?
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  4. #4
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 5
    Par défaut
    les #JoueurLeave #JoueurJoin dans l'exemple montrer, représentait des constante (en Purebasic) que j'utilisai pour identifié les paquet que j'envoyais (pour un projet en Purebasic que j'ai abandonné depuis) le schéma permettait de savoir la structure des paquets suivant leur identifiant.

    Sinon merci des informations, je pense que les stream sont ce que je recherchai, j'avais déjà croisé les >> et << pour lire et écrire mais je ne savais pas a quoi sa correspondais ni comment s'en servir, je vais étudié la doc

    Merci bien


    Socolin.

Discussions similaires

  1. Réponses: 5
    Dernier message: 04/09/2013, 19h02
  2. Concaténation de plusieurs variables
    Par Shinoda00 dans le forum Langage
    Réponses: 2
    Dernier message: 02/08/2010, 16h10
  3. Réponses: 23
    Dernier message: 05/02/2010, 10h38
  4. Concaténation avec cellules de différents types
    Par devdev dans le forum Excel
    Réponses: 4
    Dernier message: 19/03/2009, 16h38
  5. variables de différents types
    Par Maxence45 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 26/11/2007, 13h48

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