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 :

Lire le contenue d'une socket


Sujet :

C++

  1. #1
    Membre chevronné Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Par défaut Lire le contenue d'une socket
    Bonjour,

    J'ai un programme en c++ qui interagit via le protocole ModBus à une machine pour lui transmettre des ordres et je doit réaliser l'IHM en PHP.
    Pour se faire j'utilise les sockets afin que lorsque l'on clique sur un bouton sur la page PHP sa envoie l'ordre correspondant au programme c++ qui se charge de le transmettre à la machine puis de renvoyer un boolean au code PHP pour savoir si sa a marché ou non.
    Mon problème est un peu concon et se situe sur le serveur c++, je n'arrive pas à lire le buffer de la socket envoyé par le client ...

    Je pense que mon problème vient surtout du fait que je ne comprend pas la fonction recv(), je l'ai utilisé ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *buffer;
    if(recv(soc, buffer, sizeof(buffer), 0) < 0)
    Cependant lorsque j'essaye de lire le contenue de buffer je me retrouve avec des petits carrés (un par ligne).

    Afin de lire le buffer j'ai utilisé le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char *buffer = "";
    cout << "Lecture de la socket du client :" << endl;
    if(recv(soc, buffer, sizeof(buffer), 0) < 0){
        for(unsigned int i = 0; sizeof(buffer); i++)
            cout << buffer[i] << endl;
    }
    Si quelqu’un peut m’éclairai sur cet erreur qui est surement toute bête ...
    Merci d'avance

  2. #2
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Sans parler de ton souci, il y en a d'autres :

    Là, tu crées un buffer de 1 octet (je crois)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(recv(soc, buffer, sizeof(buffer), 0) < 0)
    Là tu essaies de lire 4 octets (sizeof(char *) = 4, en général). Tu vas gardiner en mémoire !!!

    Tu t'attends à avoir quoi et tu recois quoi ?

    Traces les valeurs en int :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << (int)buffer[i] ...;

  3. #3
    Membre chevronné Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Par défaut
    Bonjour,

    Citation Envoyé par fregolo52
    Tu t'attends à avoir quoi et tu recois quoi ?
    Eh bien je pensais envoyer un int et faire un test coté serveur pour savoir quel fonction exécuter. Mais pour le moment j'envoie une chaine de caractère :
    "Coucou mon programme".
    Et je ne sais pas ce que je reçois lorsque je fait un cout je voit apparaitre 4 petit carrés.

    Citation Envoyé par fregolo52
    Là tu essaies de lire 4 octets (sizeof(char *) = 4, en général). Tu vas gardiner en mémoire !!!
    Effectivement sizeof(buffer) me retourne 4.
    Il faut donc que j'initialize mon buffer avec une taille définie ? Y a t'il un moyen de récupérer la taille de ce qui est envoyé par le client ?

    J'ai crée mon buffer avec un taille de 150 mais maintenant sa ne lit plus rien Oo

    Edit :
    J'ai modifé mon code et maintenant je reçois une réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    char *buffer;
    int n = 0;
     
    //Allocation de la mémoire du tableau
    buffer = (char *) malloc(150);
    memset(buffer, 0, 150);
     
    cout << "Lecture de la socket du client :" << endl;
    if((n = recv(soc, buffer, sizeof(buffer), 0)) > 0){
    	cout << "Taille de buffer : " << sizeof(buffer) << endl;
    	for(unsigned int i = 0; i < sizeof(buffer); i++)
    		cout << i << " : " << buffer[i] << endl;
    }
    cout << "n = " << n << endl;
    La réponse que je reçois est la suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Taille de buffer : 4
    0 : c
    1 : o
    2 : u
    3 : c
    n = 4
    Ce que je trouve étrange c'est que me retourne 4 ...

  4. #4
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Ton code est mauvais !!!

    Je n'ai rien testé !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if((n = recv(soc, buffer, 150, 0)) > 0){
    	cout << "Taille de buffer RECU : " << n << endl;
    	for(unsigned int i = 0; i < n; i++)
    		cout << i << " : " << buffer[i] << endl;
    }
    n est le nb d'octets retourné par recv, donc tu dois t'en servir !!
    Apres faut faire plus propre que '150'.

    buffer est un pointeur (donc une adresse), donc quelque soit le malloc, ca fera tjrs 4.

  5. #5
    Membre chevronné Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Par défaut
    Super merci !
    Je n'ai plus qu'a me pencher sur la question du 150.

    Encore merci

    Sujet résolu !

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

Discussions similaires

  1. Lire tout le contenu d'une socket en une seule fois
    Par maximus15 dans le forum Réseau
    Réponses: 5
    Dernier message: 05/04/2010, 18h14
  2. Demande d'aide pour lire le contenu d'une editbox.
    Par Pierre.g dans le forum Windows
    Réponses: 3
    Dernier message: 20/10/2006, 21h56
  3. lire le contenu d'une fichier .Dat
    Par zidenne dans le forum Delphi
    Réponses: 10
    Dernier message: 28/07/2006, 12h27
  4. [Débutant]Comment lire le contenu d'une Listview ?
    Par PierreBord dans le forum Composants VCL
    Réponses: 2
    Dernier message: 13/02/2006, 16h40
  5. Lire le contenu d'une page web grâce à un script PHP
    Par BloodyImp dans le forum Langage
    Réponses: 3
    Dernier message: 06/11/2005, 22h29

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