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 :

[toFAQ][socket] Envoi d'une structure [FAQ]


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 64
    Points : 26
    Points
    26
    Par défaut [toFAQ][socket] Envoi d'une structure
    J'ai besoin d'envoyer un structure sur une socket, le probleme est que l'on doit normalement envoyer un char *. Lorsque j'essaie de caster ma structure en char * ca ne passe pas.


    Quelqu'un aurait une solution à me proposer ?


    Merci.

  2. #2
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    Il me semble qu'on a déjà répondu à cette question (bon d'accord la question était comment envoyer une class par un socket mais bon class et structure c globalement la même chose).

    La solution donnée est de crée une fonction qui a partir de ta structure crée un char* du type BOS |champ1 | champ2 |champ 3|EOS. (BOS et EOS pour delimiter ta structure).
    Tu envoie ça et de l'autre coté tu recrée ta structure a partir du char * (strtok sur | pour récupérer chaque élément et castage si nécessaire).

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 64
    Points : 26
    Points
    26
    Par défaut
    Merci.

    Il n'y a pas plus élégant que ça ?

    Le pire c'est qu'en C j'ai déjà envoyé des structures sur des sockets et ça marchait très bien, je ne comprends pas qu'en C++ ça ne fonctionne pas.
    Peut être qu'il existe une solution miracle que j'ignore.

  4. #4
    ovh
    ovh est déconnecté
    Rédacteur
    Avatar de ovh
    Homme Profil pro
    Architecte devops web full stack
    Inscrit en
    Mai 2002
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 841
    Points : 6 514
    Points
    6 514
    Par défaut
    Montre-nous le code que tu as utilisé, si tu l'as fait en C, en C++ ça doit marcher aussi. Il doit donc y avoir un léger problème de syntaxe au niveau des particularités du C++ je suppose...

    Tutoriels sur les UPS, e-commerce, PHP, critiques de livres...

    Pensez à consulter les FAQs et les cours et tutoriels.
    FAQ Linux - Cours et tutoriels Linux - FAQ PHP - Cours et tutoriels PHP
    Ce forum est fait pour vous et surtout par vous, merci d'en respecter les règles.

    Je n'ai rien à voir avec la société www.ovh.com !

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 64
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par ovh
    Montre-nous le code que tu as utilisé, si tu l'as fait en C, en C++ ça doit marcher aussi. Il doit donc y avoir un léger problème de syntaxe au niveau des particularités du C++ je suppose...

    Le code que j'avais fait en C c'etait il y a plusieurs mois, sous LynOS et malheureusement je n'ai pas conservé les sources.

    Par contre voila mon code C++:


    dans un .h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    struct Divers {
     
    	int cpt;
    	char texte[256];
    	int tab[2];
    };
    dans mon .cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
                    Divers envoi;
    	envoi.tab[0]=56;
    	envoi.tab[1]=512;
    	strcpy(envoi.texte,"bien recu");
    	envoi.cpt=89;
    	send(_sock,(char *)envoi, sizeof(envoi),0);
    Et donc j'ai une erreur comme quoi je ne peux pas caster ma structure en char *

  6. #6
    ovh
    ovh est déconnecté
    Rédacteur
    Avatar de ovh
    Homme Profil pro
    Architecte devops web full stack
    Inscrit en
    Mai 2002
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 841
    Points : 6 514
    Points
    6 514
    Par défaut
    C'est parce que tu ne donnes pas l'adresse de ta structure, mais directement l'objet lui-même. Rajoute & devant envoi et ça devrait marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    send(_sock,(char *)&envoi, sizeof(envoi),0);
    Dis-nous quoi.

    Tutoriels sur les UPS, e-commerce, PHP, critiques de livres...

    Pensez à consulter les FAQs et les cours et tutoriels.
    FAQ Linux - Cours et tutoriels Linux - FAQ PHP - Cours et tutoriels PHP
    Ce forum est fait pour vous et surtout par vous, merci d'en respecter les règles.

    Je n'ai rien à voir avec la société www.ovh.com !

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 64
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par ovh
    C'est parce que tu ne donnes pas l'adresse de ta structure, mais directement l'objet lui-même. Rajoute & devant envoi et ça devrait marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    send(_sock,(char *)&envoi, sizeof(envoi),0);
    Dis-nous quoi.

    Ca passe à la compil mais je ne récupère rien de cohérent à priori.

  8. #8
    Membre à l'essai
    Profil pro
    Développeur Full Stack
    Inscrit en
    Février 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Février 2003
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    normal essaye ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
                    Divers envoi; 
       envoi.tab[0]=56; 
       envoi.tab[1]=512; 
       strcpy(envoi.texte,"bien recu"); 
       envoi.cpt=89; 
       send(_sock,(char *)&envoi, sizeof(envoi),0);
    la fonction send envoie un tampon de données d'une certaine taille,il faut lui donner un pointeur sur les données.fait la même chose avec le recv

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 64
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par charon
    normal essaye ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
                    Divers envoi; 
       envoi.tab[0]=56; 
       envoi.tab[1]=512; 
       strcpy(envoi.texte,"bien recu"); 
       envoi.cpt=89; 
       send(_sock,(char *)&envoi, sizeof(envoi),0);
    la fonction send envoie un tampon de données d'une certaine taille,il faut lui donner un pointeur sur les données.fait la même chose avec le recv

    Ben j'ai fait la même chose en reception mais je ne recois pas ma structure correctement.

  10. #10
    ovh
    ovh est déconnecté
    Rédacteur
    Avatar de ovh
    Homme Profil pro
    Architecte devops web full stack
    Inscrit en
    Mai 2002
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 841
    Points : 6 514
    Points
    6 514
    Par défaut
    Les données sont complètement aléatoires ou bien juste "décalées" ?
    Montre-nous ton code de réception.

    Tutoriels sur les UPS, e-commerce, PHP, critiques de livres...

    Pensez à consulter les FAQs et les cours et tutoriels.
    FAQ Linux - Cours et tutoriels Linux - FAQ PHP - Cours et tutoriels PHP
    Ce forum est fait pour vous et surtout par vous, merci d'en respecter les règles.

    Je n'ai rien à voir avec la société www.ovh.com !

  11. #11
    Membre à l'essai
    Profil pro
    Développeur Full Stack
    Inscrit en
    Février 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Février 2003
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    est que les machine receptrices et émettrice ont le meme type de processeur.Je m'explique si on envoie des entiers d'un mac à un PC les octets vont être inversés du fait que les x86 sont en little endian et les mac en big endian

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 64
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par ovh
    Les données sont complètement aléatoires ou bien juste "décalées" ?
    Montre-nous ton code de réception.

    voila le code de réception :




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    	Divers recu;
    	recv(_sock1,(char *)&recu,sizeof(recu),0);
    	cout << recu.cpt << endl;

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 64
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par ovh
    Les données sont complètement aléatoires ou bien juste "décalées" ?
    Montre-nous ton code de réception.

    voila le code de réception :




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    	Divers recu;
    	recv(_sock1,(char *)&recu,sizeof(recu),0);
    	cout << recu.cpt << endl;
    Au niveau de l'affichage, la j'ai: -858993460

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 64
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par charon
    est que les machine receptrices et émettrice ont le meme type de processeur.Je m'explique si on envoie des entiers d'un mac à un PC les octets vont être inversés du fait que les x86 sont en little endian et les mac en big endian
    En pratique les machines tourneront toutes sous Windows, mais pour l'instant je teste tout sur une becane qui fait a la fois serveur et client.

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 64
    Points : 26
    Points
    26
    Par défaut
    j'ai trouvé mon erreur c'est bon, je n'avais pas fait de memset pour tab[] et texte....


    Ca marche !!!

    Merci à tous en tous cas.

  16. #16
    Membre à l'essai
    Profil pro
    Développeur Full Stack
    Inscrit en
    Février 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Février 2003
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    affiche le retour de send et recv et apres l'execution affiche ::WSAGetLastError() ca permet de récupérer le numéro d'erreur des fonctions sur les sockets ca pourra donner une indication.Normalement si une erreur se produit send et recv renvoient la valeur SOCKET_ERROR

Discussions similaires

  1. Envoi d'une structure via sockets
    Par milanoran dans le forum C++
    Réponses: 8
    Dernier message: 17/11/2010, 14h19
  2. Envoi d'une structure de structure
    Par renovati0 dans le forum Réseau
    Réponses: 5
    Dernier message: 06/06/2010, 03h53
  3. [Socket][Byte] Probleme d'envoi d'une taille de fichier
    Par Erok dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 12/05/2009, 17h38
  4. [C#] Envoi d'une structure par un(e) socket
    Par joprog dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/03/2007, 11h29
  5. [SOCKET] Envoi de structure
    Par Lolita59 dans le forum Réseau
    Réponses: 3
    Dernier message: 17/05/2006, 15h30

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