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

Réseau C Discussion :

Envoyer et recevoir un int venant d'une strucure avec SDL_net


Sujet :

Réseau C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 9
    Points : 12
    Points
    12
    Par défaut Envoyer et recevoir un int venant d'une strucure avec SDL_net
    Bonjour.
    Dans le cadre de mon projet de 1 er année de DUT jR&T e doit fair un jeu de dames chinoises en réseaux .J'ai choisi pour le réseau sdl_net .Mon probleme est le suivant.
    J'ai fait un serveur comme ceci:
    creation socket server
    ecoute
    creation d'une thread par client .
    J'arrive a envoyer se que je veux aux clients mais pas tout: un moment donner je doit envoyer la valeur d'un élément d'une structure ( int) et la recevoir bien entendu .J'ai beau essayer de caster de pointer d'allouer je n'y arrive pas quand je reçois la valeur c'est un truc bidon:
    Code CODE DU SERVEUR : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int temp = atoi(&liste_joueur[0].couleur);
                    char* cols= &temp ;
                    printf("Envoi de la couleur ...\n");
     
                    SDLNet_TCP_Send(mclient->socket_client,&cols,sizeof(cols));
                    printf("%s\n",cols);
                    envoi_couleur_serveur ++;

    Code CODE CLIENT : 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
     
     
    if (SDLNet_TCP_Recv(socket,cara,sizeof (cara)-1)<=0)
            {
                printf("Marche pas\n");
                return 1;
            }
            else
            {
     
                init_plateau();
                init_liste_joueurs();
                int tempcoul = atoi(cara);
                printf("recus cara %s\n",cara);
     
                printf("recus couleur %d\n",tempcoul);
                liste_joueur[0].couleur =tempcoul;
                return 0;
     
     
            }


    en gros le printf renvoi sa :
    recus cara ,óect
    recus couleur 0
    alors que la couleur devrait etre 4(j'ai essayer d'autre valeurs sa renvoi toujours 0 )



    Merci d'avance pour votre aide .

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par recluster Voir le message
    Un moment donner je doit envoyer la valeur d'un element
    d'une strucure ( int) et la recevoir bien entendu .J'ai beau essayer
    de caster de pointer d'alouer je n'y arrive pas quand je reçois la valeur
    c'est un truc bidon:
    <...>
    en gros le printf renvoi sa :
    recus cara ,óect
    recus couleur 0
    alors que la couleur devrait etre 4(j'ai essayer d'autre valeurs sa revoi
    toujours 0)
    Désolé de te dire que tu fais un peu n'importe quoi...

    Un réseau est fait pour transporter des données sous la forme d'une séquence d'octets. C'est donc à toi de définir un format de données cohérent basé sur ce principe et de t'y tenir à l'émission et à la réception.

    Tu veux transmettre une valeur. OK. Le plus simple et le plus portable est de créer une chaine de caractère terminée par un '\n', par exemple, qui représente la valeur en base 10 (décimal).
    C'est cette chaine (qui est une séquence d'octets) qui va être transmise.

    Soit à transmettre la valeur 123 située dans une variable x de type int :

    Emission
    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
     
       int x = 123;
       char data[32];
       sprintf(data, "%s\n", x); /* "123\n" */
       int n = send (socket, data, strlen (data), 0);
       if (n > 0)
       {
          printf ("%d byte(s) sent\n", n);
       }
       else if (n < 0)
       {
          printf ("Transmit error\n");
       }
       else
       {
          printf ("Far end is diconnected\n");
       }
    Réception
    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
     
       int x = 0;
       char data[32];
       int n = recv (socket, data, sizeof data - 1, 0);
       if (n > 0)
       {
          printf ("%d byte(s) received\n", n);
          data[n] = 0;
          if (data[n-1] == '\n')
          {
               /* data is complete */
               x = strtol(data, NULL, 10); 
               printf ("x = %d\n", x);
          }
          else
          {
             printf ("Missing data error\n");
          }
       }
       else if (n < 0)
       {
          printf ("Receive error\n");
       }
       else
       {
          printf ("Far end is diconnected\n");
       }
    Je conseille de lire ceci ...

    http://emmanuel-delahaye.developpez.com/reseaux.htm

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 9
    Points : 12
    Points
    12
    Par défaut
    Merci de ton aide Emmanuel .
    Je pensais pouvoir simplifier se processus en utilisant sdl_net car j'ai deja envoyer des int avec sdl_net ,sa marche niquel mais lorsque c'est une strucure sa marche plus .


    ceci marche parfaitement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SERVEUR
    printf("envoi au client de num_joueur nb_joueur , nb_ppj \n");
        int temp_nb;
        temp_nb = nb_client+1;
        char* num_joueur = &temp_nb;
        SDLNet_TCP_Send(mclient->socket_client,num_joueur,strlen(num_joueur));


    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
     
    CLIENT
     
    if (SDLNet_TCP_Recv(socket,&carac,1)<=0)
            {
     
                SDLNet_TCP_Close(socket);
                return 1;
            }
            num_joueur = (int)carac;
     
            if (SDLNet_TCP_Recv(socket,&carac,1)<=0)
            {
     
                SDLNet_TCP_Close(socket);
                return 1;
            }
            nb_joueur=(int)carac;
            printf("Nombre de joueur dans la partie :%d\n",nb_joueur);

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par recluster Voir le message
    Merci de ton aide Emmanuel .
    Je pensais pouvoir simplifier se processus en utilisant sdl_net
    C'est pas un problème de SDL_net ou pas. C'est le moyen de coder les données qui est faux et que j'ai remplacé par une méthode sure, standard, portable et éprouvé.

    Tu peux faire exactement la même chose avec SDL_net (j'ai simplement utilisé les fonctions que je connais par coeur, parce que pour moi, c'est plus simple).

    car j'ai deja envoyer des int avec sdl_net ,sa marche niquel mais lorsque c'est une strucure sa marche plus .
    C'est peut être la preuve que ce n'est pas si 'nickel'...
    ceci marche parfaitement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SERVEUR
    printf("envoi au client de num_joueur nb_joueur , nb_ppj \n");
        int temp_nb;
        temp_nb = nb_client+1;
        char* num_joueur = &temp_nb;
        SDLNet_TCP_Send(mclient->socket_client,num_joueur,strlen(num_joueur));
    Ca ne fonctionne pas du tout car le comportement est indéterminé. num_joueur n'est pas une chaine valide. Si on passe à strlen() l'adresse d'une chaine invalide, le comportement est indéfini.

    Attention, on ne peut en aucun cas se fier au seul comportement visible pour valider un fonctionnement. Il faut d'abord éliminer les comportements indéfinis, ce qui ne peut se faire qu'à la main (contrôle visuel par du personnel qualifié).

    Nota :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        char* num_joueur = &temp_nb;
    devrait provoquer un warning sur la plupart des compilateurs...

Discussions similaires

  1. gettype() et les int venant d'une superglobale
    Par muSQLor dans le forum Langage
    Réponses: 10
    Dernier message: 20/05/2014, 10h26
  2. Réponses: 7
    Dernier message: 07/01/2009, 08h53
  3. Libcurl : Envoyer et recevoir une variable.
    Par Poison_xtreamlua dans le forum Réseau
    Réponses: 5
    Dernier message: 04/08/2008, 10h14
  4. DTS venant d'une table avec colonnes variables
    Par Poussy-Puce dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 19/08/2007, 23h29
  5. [VB.NET] Recevoir un paramètre venant d'une adresse?
    Par Pleymo dans le forum Windows Forms
    Réponses: 2
    Dernier message: 25/01/2005, 21h23

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