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 :

problème avec les sockets


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 209
    Points : 83
    Points
    83
    Par défaut problème avec les sockets
    bonjour
    je veux mettre sur le buffer que je vais envoyer via le socket des entiers, des floats et et une chaine, avec la fonction send(csock, buffer, 255, 0) le buffer doit être du type const char*. je me demande comment faire.

    merci pour vos réponses

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Code Un exemple de code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    float f = 3.1415;
    int i = 123456;
    char buffer[255];
       sprintf(buffer, "data = %f %d", f, i);
       send(csock, buffer, strlen(buffer), 0);
    A mettre à une sauce un peu plus c++ et à sécuriser afin de ne pas faire un buffer overflow avec le sprintf().

    C'est pour te montrer le principe
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    La solution de ram-0000 te permettra d'envoyer une chaîne de caractère avec les valeurs.
    Si tu veux les envoyer en binaire, alors il faudra passer par de htonl à l'envoi et ntohl à la réception pour les long. Pour la chaîne de caractère, un bête memcpy devrait suffire. En revanche, j'avoue que je ne sais pas comment faire pour les float/double.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 209
    Points : 83
    Points
    83
    Par défaut
    bonjour
    merci ram-0000 j'ai trouvé la fonction sprintf dans une heure tardive hier mais mon problème devient de plus en plus compliqué :

    à la reception je sais pas comment faire le traitement inverse.

    ce que je veux faire c'est d envoyer une trame contenant un header un identificateur est des données utiles et jusqu'à présent j'avoue que je ne sais pas comment extraire les informations de la trame reçue. merci pur vos suggestions

  5. #5
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Bonjour,

    Question qui peut sembler bête : ne peux-tu pas utiliser une bibliothèque C++ qui te machera le travail et surtout te permettra de travailler directement sur des std::string, comme Boost.Asio ?

    Bien que là, tu peux déjà travailler sur une std::string et des std::stringstream pour construire la chaîne à envoyer, et récupérer un const char* grâce à la fonction membre std::string::c_str(), à appeler sur la std::string que tu auras construite.

    PS : la FAQ C++ te sera d'une grande aide si tu ne connais pas tout ça.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 209
    Points : 83
    Points
    83
    Par défaut
    merci pour ta solution Alp je vais profiter de ta gentillesse et ton expérience pour te demander comment je vais traiter la chaine en réception

  7. #7
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Hé bien dans le header tu as toutes les informations, tu sais comment elles sont disposées.

    De plus, tu as un char* à la réception, qui te permet de construire une std::string.

    C'est là que tu repars sur les std::stringstream mais cette fois pour séparer les différentes données.

    Les sections suivantes de la FAQ t'aideront :
    http://cpp.developpez.com/faq/cpp/?page=strings
    http://cpp.developpez.com/faq/cpp/?page=SL

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    En ce qui concerne la réception, il faut que le récepteur connaisse la longueur du "paquet" (trame, chaine, nombre, ce que tu veux) à recevoir.

    Pour cela, j'utilise un concept qui s'appelle DLV c'est à dire date, longueur, valeur.

    Même si dans ton cas, tu peux oublier la date, tu dois transmettre la longueur de ce que tu veux transmettre.

    Ainsi, le récepteur lit d'abord la longueur, et sais ainsi combien d'octets il y a à recevoir.

    Code émetteur si on reprend mon exemple : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
       // préparation des données
    float f = 3.1415;
    int i = 123456;
    char buffer[255];
       sprintf(buffer, "data = %f %d", f, i);
    int len = strlen(buffer);
       // envoi de la longueur
       send(csock, &len, sizeof(len), 0);
     
       // envoi de la valeur
       send(csock, buffer, strlen(buffer), 0);

    Code récepteur si on reprend mon exemple : 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
     
       // reception de la longueur
    int len = 0;
       recv(csock, &len, sizeof(len), 0);
     
       // allocation du buffer de réception
    char *buffer = malloc(len);
     
       // réception des données
       recv(csock, buffer, len, 0);
     
       // traitement du bloc recu
       mon_traitement(buffer, len);
     
       // libération du bloc
       free(buffer);

    Attention je n'ai pas mis les contrôle d'erreur, à toi de le faire ...
    C'est toujours du C, à toi de le mettre en C++
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 209
    Points : 83
    Points
    83
    Par défaut
    dans la fonction mon_traitement je ferais par exemple une conversion du type char* to string et puis string to int afin de recuperer la valeur emise.

  10. #10
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    C'est tout à fait ça.

    Mais le code de ram_0000 est du C. C'est à transposer en C++ tout ça, grâce à mes indications notamment. (à moins que tu veuille tout laisser en C :p)

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 209
    Points : 83
    Points
    83
    Par défaut
    merci bien pour vos réponses et je m 'excuse si mes questions étaient bêtes Alp

  12. #12
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Elles ne le sont pas. Il faut en fait bien passer par ce genre de problèmes pour concevoir des architectures plus complexes.

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

Discussions similaires

  1. un serieux problème avec les sockets
    Par dc.sara dans le forum Réseau
    Réponses: 4
    Dernier message: 23/01/2008, 16h11
  2. problèmes avec les sockets
    Par lukbutor dans le forum Réseau
    Réponses: 24
    Dernier message: 23/04/2007, 01h12
  3. Problème avec les sockets
    Par projeticq dans le forum Réseau
    Réponses: 14
    Dernier message: 19/04/2007, 09h32
  4. Problème avec les sockets et la fonction accept
    Par projeticq dans le forum Réseau
    Réponses: 6
    Dernier message: 13/04/2007, 11h37
  5. [Win32] Problème avec les sockets
    Par mickael777 dans le forum MFC
    Réponses: 3
    Dernier message: 12/08/2005, 11h15

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