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++Builder Discussion :

probleme envoi SendBuf()


Sujet :

C++Builder

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 28
    Par défaut probleme envoi SendBuf()
    Bonjour,

    Je suis en train de developper un petit jeu avec un client serveur sous builder et je suis face a un probleme pour envoyer les donnée de jeu aux clients.

    Je doit me debrouiller pour envoyer un vecteur de ma classe joueur par mon ServerSocket mais je ne sais pas comment faire.

    J ai essayer avec la fonction sendbuf :

    ServerSocket1->Socket->SendBuf(listjoueur[0],listjoueur.size());

    mais vu ke cette fonction utilise du void * bah ca met une erreur de compilation.

  2. #2
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Citation Envoyé par Syl91
    Bonjour,

    Je suis en train de developper un petit jeu avec un client serveur sous builder et je suis face a un probleme pour envoyer les donnée de jeu aux clients.

    Je doit me debrouiller pour envoyer un vecteur de ma classe joueur par mon ServerSocket mais je ne sais pas comment faire.

    J ai essayer avec la fonction sendbuf :

    ServerSocket1->Socket->SendBuf(listjoueur[0],listjoueur.size());

    mais vu ke cette fonction utilise du void * bah ca met une erreur de compilation.
    Le mieux dans ces cas la est de se faire un format de trame, exemple ta trame pouré etre : LJ,Joueur1,Joueur2,Joueur3,...;
    quand le client recoit cette trame, il sais que c'est une liste de joueur grace au deux premier caractere "LJ", et sais que chaque login de joueur est séparé par une virgule, la trame ce termine ici par un ';' ce qui va dire au client d'arrété de chercher des nom.
    Ceci est un exemple est tu peut l'adapté comme tu veut pour toute sorte de trame ou de programme, du moment que le client et le serveur on le meme format pour les trame cela fonctionnera, si tu as des problemes demande moi des precisions.
    A plus

  3. #3
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    bonjour ,
    tu peux également fair un cast
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ServerSocket1->Socket->SendBuf((void*)listjoueur[0],listjoueur.size());
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 28
    Par défaut
    J'effectue mes test sur le premier element de ma liste mais le cast n'a pas l air de fonctionner (enfin a mon avis je doit me tromper kk part ):

    //envoi du premier element joueur de la liste au client
    ServerSocket2->Socket->Connections[0]->SendBuf(((void*)&listjoueur[0]),listjoueur.size());

    //reception du client
    ClientSocket2->Socket->ReceiveBuf((reinterpret_cast<Joueur*>(&J)),sizeof(Joueur));

    Je pense que je dois me melanger ds les type pasque ca passe a la compile mais un bonne grosse erreur memoire m accueil kan je test une des valeur receptionné...

    Pour moi ici je cast mon element de liste en void * , puis j l envoie et a la reception je cast en joueur* et recopie l adresse sur un element joueur cree a cet effet.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 28
    Par défaut Desesperate Programming boy
    Bon cette fois je craque.....

    G essayer pas mal de chose mais ca ne marche tjrs pas...
    G d abord essayer d envoyer un bete entier, pas de probleme:

    ServerSocket2->Socket->Connections[0]->SendBuf((void*)&i,sizeof(int));
    ClientSocket2->Socket->ReceiveBuf((int*)&j,sizeof(int));

    ensuite je voudrais envoyer un element de ma liste suivant le meme principe :

    ServerSocket2->Socket->Connections[0]->SendBuf((void*)&listjoueur[0],sizeof(Joueur));

    ou listjoueur est de type vector<joueur> et joueur une classe contenant des AnsiString et des int.

    a la reception :

    ClientSocket2->Socket->ReceiveBuf((Joueur*)&J,sizeof(Joueur));

    ou J est un objet de type Joueur

    A l execution de tout ceci ,une jolie violation memoire....

    (j ai essayer avec du reinterpret_cast<Joueur *> mais meme probleme)

    Je ne sais plus quoi faire.... Help plz ! :'(

  6. #6
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Je ne sais pas de quoi est composé exactement ta classe Joueur, mais si tu veut suivre mon idée, fait comme ceci :
    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
    AnsiString trame ;
    int i ;
    trame = "LJ;"
    for(i=0;i<listjoueur.size();i++){
      trame += listjoueur[i].AnsiString1 ;
      trame += "," ;
      trame += listjoueur[i].AnsiString2 ;
      trame += "," ;
      ...
      trame += "," ;
      trame += listjoueur[i].int1 ;
      trame += "," ;
       trame += listjoueur[i].int2 ;
      trame += ";" ;
    }
     ServerSocket2->Socket->Connections[0]->SendText(trame) ;
    Pour ton client tu recoit la trame comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AnsiString trame ;
    trame =  ClientSocket2->Socket->ReceiveText() ;

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 28
    Par défaut decoupage de trame
    Bonjour,

    Suite a ton message, j ai efectuer l'encodage de ma trame (a partir de mon vecteur de joueur) et je l ai envoyer comme il se doit.

    A la reception, je doit maintenant redecouper la trame afin de reconstituer ma liste.

    Quels fonctions sont necessaires pour cela??

    Je ne comprend pas bien l'utilisation de la fonction trame.Pos()

  8. #8
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    bonjour,
    tu as dit que
    'effectue mes test sur le premier element de ma liste mais le cast n'a pas l air de fonctionner (enfin a mon avis je doit me tromper kk part ):

    //envoi du premier element joueur de la liste au client
    ServerSocket2->Socket->Connections[0]->SendBuf(((void*)&listjoueur[0]),listjoueur.size());

    //reception du client
    ClientSocket2->Socket->ReceiveBuf((reinterpret_cast<Joueur*>(&J)),sizeof(Joueur));

    Je pense que je dois me melanger ds les type pasque ca passe a la compile mais un bonne grosse erreur memoire m accueil kan je test une des valeur receptionné...

    Pour moi ici je cast mon element de liste en void * , puis j l envoie et a la reception je cast en joueur* et recopie l adresse sur un element joueur cree a cet effet.
    la méthode SendBuf n'envoye que par ta connection socket que les données de ta classe Joueur

    a la réception par la méthode ReceicBuffer tu ne recevra donc que des données et non pas ta classe joueur
    pour tester ceci dans ta méthode de réception du Socket analyse le contenu

    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int BufferLength= ClientSocket2->Socket->ReceiveLength();
    char* Buffer = new char[BufferLength];
    ClientSocket2->Socket->ReceiveBuf((char*)Buffer ,BufferLength);
    // reconstruction de ta classe a partir des données recues
    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 28
    Par défaut fin du probleme
    Bon j'ai repris tout mon code et je suis enfin arriver a resoudre mon probleme.

    J'ai donc créé une trame en AnsiString en separant mes données par des "," (";" pour la fin de la trame) et j'ai envoyé le tout avec la methode SendText() a mon client.

    Du coté client, j'ai recuperer ma trame ReceiveText() puis reconstruis mon objet grace au methode de la classe AnsiString => Pos(",") qui retourne l'index de la valeur passée en parametre et SubString() qui permet de recuperer une parti de la chaine.

    Merci a tous pour ces conseils.

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

Discussions similaires

  1. [Socket] Probleme envois de message
    Par Pierrick584 dans le forum C++
    Réponses: 12
    Dernier message: 28/06/2006, 19h07
  2. [Mail] probleme envoie mail
    Par phoeniix07 dans le forum Langage
    Réponses: 7
    Dernier message: 21/06/2006, 14h35
  3. [AXIS] Problem envoie de mail par webservice
    Par BriceTheNice dans le forum Services Web
    Réponses: 1
    Dernier message: 21/06/2006, 11h29
  4. [MySQL] probleme envoi avec POST
    Par Tr@nkill dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 24/04/2006, 09h11
  5. Probleme envoi multicast sur XP
    Par BattlingJM dans le forum Windows
    Réponses: 6
    Dernier message: 16/03/2006, 17h13

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