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

SL & STL C++ Discussion :

Pipe et char*


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 11
    Par défaut Pipe et char*
    bonjour, j'ai deux processus reliés par un pipe, je souhaite envoyer une structure

    J'ai declaré ma structure comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct verif_particulier{
        char * serveur; //serveur1 ou serveur2
         int req_banque;  //"CHECK CLIENT", "UPDATE COMMERÇANT"
        unsigned long long id_client;
        float mount;
    };
    voila le code que je fait pour initialiser la structure et l'envoyer

    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
    //la string a envoyer
        serveur="serveur_1";
     
        // créer le buffer pour copier la chaîne et la mettre en tableau de char
        size_t size = serveur.size() + 1;
        char * buffer3 = new char[ size ];
        // copier la chaîne
        strncpy( buffer3, serveur.c_str(), size );
     
     
        //creation de la structure a envoyer a banque
        t_verif_client.serveur=buffer3; //serveur_1 ou serveur_2
        t_verif_client.req_banque=0;  //"CHECK CLIENT 0", "UPDATE COMMERÇANT 1"
     
        t_verif_client.id_client=t.id2; //id du client
        t_verif_client.mount=t.mount;//Montant
     
        // libérer la mémoire
        delete [] buffer3;
     
        //test affichage
        cout << "SP t_verif_client.serveur " << t_verif_client.serveur<<" buffer "<<buffer3<<" serveur "<<serveur<<endl;
     
     
        /* envoie de donnees de SP vers banque */
        write(tube_ecriture[i][1], &t_verif_client,sizeof(t_verif_client));


    et dans mon autre processus (banque) j'essaye d'afficher le resultat comme cela


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    read(tube_ecriture, &t_verif_client,sizeof(t_verif_client));       
     
            cout<<"B : t_verif_client.serveur : "<<t_verif_client.serveur<<" t_verif_client.req_banque : "<< t_verif_client.req_banque<<" t_verif_client.id_client : "<< t_verif_client.id_client<<" t_verif_client.mount "<< t_verif_client.mount<<endl;

    Donc le probleme est que t_verif_client.serveur reste desesperement vide lors de l'affichage dans banque, j'avoue ne pas comprendre,par contre les int s'affiche sans probleme

    merci de votre aide

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Normal, tu envoies un pointeur, et non la donnée pointée. De l'autre côté, ce pointeur ne sert à rien (et en plus, tu détruit la donnée pointée avant de transmettre). De toute manière, envoyer une structure comme ça risque de poser plein d'autre problèmes, dès lors que les deux programmes ne seront pas compilés avec le même compilateur, même version, même options de compilation.

    La règle : Tu dois sérialiser les données d'un côté, les désérialiser de l'autre.

    Exemple manuel (il y a des bibliothèque pour faciliter ça, si jamais tu as beaucoup de choses à envoyer) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // Ecriture
    ostringstream oss;
    oss << serveur << endl; // hypothèse : serveur ne contient pas de retour à la ligne
    oss << req_banque << ' ' << id_client << ' ' << mount;
     
    write(tube_ecriture[i][1], oss.str().c_str(),oss.str().size());
     
    // Lecture : Pas fini, je ne connais pas les pipes, et ne sais pas comment gérer la taille du buffer d'arrivée
    char buffer[1000];
    read(tube_lecture[i][1], buffer,???);
    istringstream iss(buffer);
    getline(iss, serveur);
    iss >> req_banque >> id_client >> mount;


    PS : Utiliser un float pour un montant monétaire fait peur. J'espère qu'il s'agit d'un logiciel jouet, et non pas d'un logiciel devant réellement servir dans une banque. Les règles de calcul monétaire ne sont pas les règles de calcul de float.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 11
    Par défaut
    Merci pour la reponse mais, Pour plus de precision, c'est un exercice factice, je suis etudiant, de plus les deux processus sont en fait des fork dont le fils a subit un execlp

    donc necesserement, les deux proccessus seront compilés en meme temps

    De plus la structure est demandée par le professeur, pourquoi ne pourrais je pas envoyer de structure? sachant que les int passent sans soucis?

    J'envoie effectivement un pointeur, car les pipe n'accepte pas les string.

    Merci,

    Amau

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par amau96 Voir le message
    De plus la structure est demandée par le professeur, pourquoi ne pourrais je pas envoyer de structure? sachant que les int passent sans soucis?
    Les int ne passent pas sans soucis: entre une machine big Endian et little Endian, tu aurais des surprises. Ou entre une machine 16 bits et 32 bits.
    On ne passe pas un structure en brutal pour tout ce genre de raison:
    -> Les deux machines peuvent ne pas avoir la même représentation (little/big Endian),
    -> Les deux machines peuvent avoir des contraintes d'alignements différentes,
    -> Passer un pointeur est une erreur,
    -> d'ailleur l'émetteur peut être écrit en C++ et le récepteur en tout autre chose!
    En réseau, quand tu échange des données, il faut décrire les données utilisées (couche présentation). Cela te permet d'écrire le formattage côté émetteur et le déformatage côté récepteur. Entre les deux, ce sont des octets sans signification qui sont transportés.

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Les int ne passent pas sans soucis: entre une machine big Endian et little Endian, tu aurais des surprises. Ou entre une machine 16 bits et 32 bits.

    un pipe ça peut être sur deux machines différente??

    Citation Envoyé par amau96 Voir le message
    c'est un exercice factice, je suis etudiant, de plus les deux processus sont en fait des fork dont le fils a subit un execlp

    dDe plus la structure est demandée par le professeur, pourquoi ne pourrais je pas envoyer de structure? sachant que les int passent sans soucis?
    Ce n'est pas ce que c'est un exo qui ne faut pas le faire correctement.
    Pourquoi est tu contre la serialization???(Surtout qu'à mon avis c'est le but de ton exo).

    Citation Envoyé par amau96 Voir le message
    J'envoie effectivement un pointeur, car les pipe n'accepte pas les string.
    Et comment l'autre process pourrais récupérer les données de ce pointeur????

  6. #6
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 11
    Par défaut
    bon j'ai trouvé,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t_verif_client.serveur=buffer3;
    n'a pas de sens fallait faire un strncpy

    Citation Envoyé par Mongaulois Voir le message
    Et comment l'autre process pourrais récupérer les données de ce pointeur????
    Car je créé le pipe avant le fork, apres je fais un execlp, et dans le execlp j'envoie le FD du pipe en parametre pour garder la reference, du coup, j'arrive a recupéré les données.

    Merci beaucoup tout de meme pour avoir pris le temps de repondre a mes questions.

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Mongaulois Voir le message

    un pipe ça peut être sur deux machines différente??
    Effectivement, j'ai lu trop vite.
    Cependant, je préfère considérer les échanges entre deux applis indépendamment du transport utilisé et par conséquent toujours suivre les quelques règles de bases. L'expérience montre qu'un client qui demande à deux applis d'un même poste de communiquer ensemble finit par demander à déporter l'une des deux sur un autre poste....
    P.S.: il me semble que sous windows tu peux utiliser des pipes nommés entre deux machines.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/07/2003, 16h24
  2. Char(x) -> chaine concaténée d'espaces ?
    Par rgz dans le forum Débuter
    Réponses: 7
    Dernier message: 27/06/2003, 11h59
  3. [PostgreSql] Problème de cadreage de char !!!
    Par moipastoi dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/05/2003, 18h01
  4. Réponses: 6
    Dernier message: 24/03/2003, 17h11
  5. Traitement d'un char* renvoyé par une DLL en C++
    Par LuluTchab dans le forum Langage
    Réponses: 4
    Dernier message: 22/03/2003, 21h48

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