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 des objets client/serveur


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 53
    Par défaut Envoyer des objets client/serveur
    Bonjour !

    J'ai regardé dans la faq, mais je n'ai pas trouvé la réponse à ma question..


    Est-il possible d'envoyer et de recevoir des objets grâce à send() et recv() ?

    Mon client travaille sur des objets et doit les envoyer au serveur afin des les stocker sur des fichiers.

    Merci

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Bien sûr. Mais la réponse n'est pas dans la FAQ mais dans les tutoriels.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 53
    Par défaut
    J'ai regardé mais j'ai pas trouvé...
    Petite précision, je travaille sur linux.

    Est-ce qu'il ne faudrait pas caster mon objet en void* pour ensuite l'envoyer par send() ?

    Dans ce cas la, comment caster mon objet ? Quand je fais un static_cast, j'ai une erreur. (invalid static_cast form '...' to void*)

    J'ai cru comprendre que c'est un des problèmes de compatibilité C/C++...

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Tu es dans la mauvaise rubrique. « static_cast », c'est du C++.

    recv() et send() sont des appels système Unix, dont l'interface est en C, certes, mais qui sont indépendants du langage proprement dit. send() et recv() vont te permettre d'émettre n octets d'une machine à l'autre. À toi de choisir ce que tu mets dedans.

    Si tes plateformes sont identiques d'un côté comme de l'autre, tu peux envoyer directement le contenu d'une structure, ou de l'instance d'une classe en C++, en pointant dessus et en envoyant sizeof(objet) octets. Cependant, ta structure ne doit contenir aucun pointeur vers des données extérieures à ta classe (comme, par exemple, une chaîne de caractères en lecture seule), car ceux-ci ne voudront plus rien dire une fois arrivés de l'autre côté.

    Si c'est ça que tu veux faire, Boost propose des facilités de sérialisation : http://www.developpez.net/forums/d40...alisation-cpp/

    Merci de nous préciser si tu travailles en C ou en C++, que l'on dépose ton message dans la bonne rubrique le cas échéant.

  5. #5
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    recv() et send() sont des appels système Unix, dont l'interface est en C
    raccourci qui peut s'avérer faux. Ces fonctions sont partie de la spécification de l'API "Berkeley socket", originellement implémentée pour BSD.
    C'est une API qui s'est imposée comme standard, repris dans la norme POSIX et pas une exclusivité "Unix".
    Windows qui est partiellement conforme POSIX, supporte aussi cette spécification.
    Par contre parler d'appel système, la c'est faux ! ..
    fopen(), par exemple n'est pas un appel système !

    Citation Envoyé par Obsidian Voir le message
    Si tes plateformes sont identiques d'un côté comme de l'autre, tu peux envoyer directement le contenu d'une structure, ou de l'instance d'une classe en C++, en pointant dessus et en envoyant sizeof(objet) octets. Cependant, ta structure ne doit contenir aucun pointeur vers des données extérieures à ta classe (comme, par exemple, une chaîne de caractères en lecture seule), car ceux-ci ne voudront plus rien dire une fois arrivés de l'autre côté.

    Très mauvais conseil
    ! Car cela nécessite une version de l'OS identique, un processeur identique (big/littte endian) et surtout un compilo identique et aussi des options de packing et d'alignement identique. Bref, à surtout ne pas faire.
    Il faut sérialiser de manière portable et cela ne peut se faire en dumpant la mémoire brute sur une socket !
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 53
    Par défaut
    Le hic, c'est que je dois manipuler des objets ! Et donc, je dois coder en c++, avec un réseau derrière tout ça. Donc je dois mélanger C et C++.

    Comme faire pour arriver à envoyer un objet C++ avec send ?

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Citation Envoyé par Vincent Rogier Voir le message
    Par contre parler d'appel système, la c'est faux ! ..
    fopen(), par exemple n'est pas un appel système !
    fopen(), non, mais recv() et send(), si. Ou alors, on n'a pas la même définition d'un appel système.

    Très mauvais conseil[/U] ! Car cela nécessite une version de l'OS identique, un processeur identique (big/littte endian) et surtout un compilo identique et aussi des options de packing et d'alignement identique. Bref, à surtout ne pas faire.
    Il faut sérialiser de manière portable et cela ne peut se faire en dumpant la mémoire brute sur une socket !
    Entièrement vrai, mais ça, on le sait tous. Mon commentaire traite justement de la sérialisation et de Boost, donc pas d'ambigüité de ce côté-là.

Discussions similaires

  1. cookie client envoyant des credentials au serveur
    Par nicorama dans le forum Sécurité
    Réponses: 0
    Dernier message: 19/06/2008, 11h46
  2. Envoyer des objets par valeur
    Par Promeneur dans le forum Windows Communication Foundation
    Réponses: 7
    Dernier message: 28/03/2008, 17h45
  3. [Prototype] Utiliser Json pour envoyer des données au serveur
    Par GandalfZeGrey dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 14/02/2008, 17h16
  4. [C#]envoi des images client/serveur
    Par DavidPAY dans le forum C#
    Réponses: 1
    Dernier message: 18/12/2007, 16h26
  5. Réponses: 2
    Dernier message: 19/09/2007, 10h21

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