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 :

Envoi d'une structure via sockets


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Points : 19
    Points
    19
    Par défaut Envoi d'une structure via sockets
    Bonjour je travail sur un projet pour le transfert de video via socket.

    pour le moment j'essaie juste de transmettre une image mais je n'arrive pas.

    Le problème n'est pas dans la socket car a mon avis les données sont transmise c'est au niveau de l'affichage de l'image que j'ai le problème .

    voila mon code : SERVEUR
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    IplImage *img;
     
    //On charge notre image depuis un fichier.
    img=cvLoadImage("cisco.jpg");
     
    // envoi de la structure 
    sock_err = send(Client,reinterpret_cast<char*>(&img), sizeof(img), 0);

    CLIENT :
    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
     
    IplImage *img;
     
    /* Si l'on reçoit des informations : on les affiche à l'écran */
    recv(ClientSock,reinterpret_cast<char*>(&img), sizeof(img), 0);
     
    //On crée une fenêtre intitulée "Hello World", 
    //La taille de cette fenêtre s'adapte à ce qu'elle contient.
    cvNamedWindow("Hello World", CV_WINDOW_AUTOSIZE);
     
    //On affiche l'image dans la fenêtre "Hello World".
    cvShowImage("Hello World", img);
     
    //On attend que l'utilisateur appuie sur une touche (0 = indéfiniment).
    cvWaitKey(0);
     
    //Destruction de la fenêtre.
    cvDestroyWindow("Hello World");
     
    //Libération de l'IplImage (on lui passe un IplImage**).
    cvReleaseImage(&img);
    a mon avis la fonction cvShowImage n'arrive pas a afficher la structure img.

    est-ce que quelqu'un aurait une idée

    Merci pour votre aide

  2. #2
    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
    Salut,
    PEtit problème : &img, c'est l'adresse de ta variable img de type pointeur. Et sizeof(img) c'est la taille d'un pointeur (probablement 4 octets). Donc ton serveur envoi l'adresse d'img au client... ce qui est tout sauf une image valide. Ce qui en fait probablement une adresse invalide et provoque un crash à l'exécution. => c'est bien un problème d'envoi et pas un problème d'affichage côté client
    En fait, en C++ on ne peut pas échanger des objets tel que tu le fais. Beaucoup d'éléments sont incompatibles (type POD, endianess, alignement, etc.). On utilise pour cela la sérialisation mot pour dire qu'on sauvegarde un objet dans un flux avec un format bien déterminé. Ici, c'est magique, la sérialisation existe déjà : il s'agit du fichier. Une démarche possible serait d'envoyer le fichier du serveur vers le client, de sauvegarder le fichier côté client et de l'ouvrir avec OpenCV. Tu peux certainement n'échanger que les données mais je ne connais pas OpenCV pour pouvoir t'aider en ce sens.

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Bonsoir merci pour la réponse

    au faite la solution de fichier est possible, mais le problème c'est que plus tard je souhaite transmettre des frames depuis une webcam.

    c'est pour cela je dois transmettre ma structure et non pas le fichier.

    Auriez-vous une idée.

  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
    Points : 13 017
    Points
    13 017
    Par défaut
    Envoyer les données en brut et reconstituer après côté client ? Voir avec la doc OpenCV ce qui est échangeable. Ce qui est sur c'est que tu ne peux pas envoyé une classe C++ telle quelle par socket. Ca ne marche pas. Peut être que Boost.Serialize (ou ce tuto : Boost.Serialization : La sérialisation avec Boost ) peut t'aider.

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    ok merci pour l'info je vais me documenter sur la sérialisation des données .

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 33
    Points : 26
    Points
    26
    Par défaut
    Je pense que pour envoyer une image type OpenCV, si tu ne veux pas mettre en oeuvre une librairie de sérialization, tu pourrais te contenter d'envoyer un messageformatté à ta sauce:


    <STX>img->width;img->height;img->imageSize;img->depth;img->imageData<ETX>

    Une sorte de sérialization à la main...


    ++s

    F.

  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
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Citation Envoyé par trop_wizz Voir le message
    Une sorte de sérialization à la main...
    Pourquoi (mal) faire à la main ce qu'une bibliothèque éprouvée te propose ? A part pour de l'apprentissage, je n'en vois pas la nécessité.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 33
    Points : 26
    Points
    26
    Par défaut
    Bof, juste au cas ou on ai pas envie d'inclure Boost (qui je suis d'accord fera tout à fait l'affaire...) dans son projet pour des raisons diverses et variées.

    Aussi, dans ce cas précis, on transmet uniquement l'information nécessaire. Pour une application video, il pourraitêtre intéressant de limiter la volume de données transmises.

    Mais bon effectivement, je ne connais pas les contraintes requises pour ce projet en particulier...ce ne sont donc que des conjectures

    ++

    F.

  9. #9
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Comme l'a souligné 3DArchi, envoyer une classe par socket c'est tout à fait faisable avec la sérialization de boost.
    Voir l'exemple réseau + sérialization ici : http://gwenael-dunand.developpez.com...asio/#LVII-C-1

Discussions similaires

  1. Reception d'une structure via un socket en java
    Par mlboua dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 01/05/2014, 15h59
  2. Envoi de structure via socket
    Par RoZyk dans le forum Réseau
    Réponses: 4
    Dernier message: 09/11/2010, 10h01
  3. Envoi d'une valeur par socket
    Par bibom dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/06/2007, 14h04
  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. [toFAQ][socket] Envoi d'une structure
    Par julien20vt dans le forum C++
    Réponses: 15
    Dernier message: 23/04/2003, 15h47

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