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++Builder Discussion :

Envoi d'une capture d'ecran par socket


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 13
    Points : 10
    Points
    10
    Par défaut Envoi d'une capture d'ecran par socket
    Bonjour,

    J'ai un souci pour envoyer une capture d'ecran par socket.
    Voici mon code qui fait la capture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            /* Prend la résolution utlisé */
            int ScrW=Screen->Width, ScrH=Screen->Height;
            /* Applique la résolution */
            CopieFond->SetBounds(0,0,ScrW,ScrH);
            /* Capture l'ecran */
            HWND hWnd = GetDesktopWindow();
            HDC hDC = GetDC(hWnd);
            /* Copie la capture dans le TImage */
            BitBlt(CopieFond->Canvas->Handle,0,0,ScrW,ScrH,hDC,0,0,SRCCOPY);
            ReleaseDC(hWnd,hDC);
            CopieFond->Height = 480;
            CopieFond->Width = 640;
    Tout ca marche très bien, mais j'aimerai envoyer cette capture par socket.
    J'utilise donc un flux pour l'envoyer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            TMemoryStream *stream = new TMemoryStream();
            CopieFond->Picture->Bitmap->SaveToStream(stream);
            Socket->SendStream(stream);
    En fait le problème ce situe niveau client.
    L'évenement OnRead du socket n'est jamais déclenché.
    Par contre si j'utilise ce code coté serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            TMemoryStream *stream = new TMemoryStream();
            CopieFond->Picture->Bitmap->SaveToFile("test.bmp");
            stream->LoadFromFile("test.bmp");
            Socket->SendStream(stream);
    Le client reçoit bien les données mais pas complétement :4.27 ko sur 3Mo
    Voici mon code coté 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
     
                    TMemoryStream *Stream = new TMemoryStream();
     
                    while (Socket->ReceiveLength())
                    {
                            int len = Socket->ReceiveLength();
                            /* buffer de réception */
                            char *buf = new char[len];
                            /* Reception données */
                            Socket->ReceiveBuf(buf, len);
                            /* Ecriture du buf dans le flux */
                            Stream->Write(buf, len);
                            delete(buf);
                    }
                    CopieFond->Picture->Bitmap->LoadFromStream(Stream);
    Donc si quelqu'un peut m'eclairer...
    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    C'est du Borland, ça, non?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Médinoc
    C'est du Borland, ça, non?
    Tout a fait

  4. #4
    Membre averti
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Points : 360
    Points
    360
    Par défaut
    Dans ta boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while (Socket->ReceiveLength())
    avant d'écrire dans Stream, as-tu vérifié que Socket->ReceiveBuf voyait bien passer la totalité des données envoyées? Si non, avec Socket->SendStream(stream), est-ce que stream a bien la taille requise (3Mo) ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Altau
    Dans ta boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while (Socket->ReceiveLength())
    avant d'écrire dans Stream, as-tu vérifié que Socket->ReceiveBuf voyait bien passer la totalité des données envoyées? Si non, avec Socket->SendStream(stream), est-ce que stream a bien la taille requise (3Mo) ?
    En fait les données ne sont pas envoyées d'un coup apparement.
    Donc OnRead est exectuer plusieurs fois.
    J'ai donc modifié mon code et ca a l'aire de marcher.
    Serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            CopieFond->Picture->Bitmap->SaveToFile(Application->GetNamePath()+"test.bmp");
            TMemoryStream *stream = new TMemoryStream();
            CopieFond->Picture->Bitmap->SaveToStream(stream);
            stream->sekk(0, soFromBeginnig);
            Socket->SendStream(stream);
            Socket->SendText("fin_fichier");
    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
    22
     
                    while (Socket->ReceiveLength())
                    {
                            int len = Socket->ReceiveLength();
                            /* buffer de réception */
                            char *buf = (char *)malloc(len);
                            /* Reception données */
                            Socket->ReceiveBuf(buf, len);
                            if (strcmp(buf,"fin_fichier") == 0)
                            {
                                    /* Si fichier transmis on le stocke dans test.bmp */
                                   Stream->Seek(0, soFromBeginning);                               
                                   CopieFond->Picture->Bitmap->LoadFromStream(Stream);
                            }
                            else
                            {
                                    /* Sinon Ecriture du buf dans le flux */
                                    Stream->Write(buf, len);
                                    delete(buf);
                                    Label1->Caption = len;
                            } 
                    }
    En fait j'avais oublié de mettre stream->seek(0, soFrombeginnig) c'est pour ca que ca marchait pas quand je voulais envoyer directement le stream sans passer par un fichier bmp...

  6. #6
    Membre actif Avatar de Bily.sdi
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 208
    Points : 206
    Points
    206
    Par défaut
    si tu as 2pc peux tu savoir qu'elle est le cp qui envoi l'image ?

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/07/2006, 11h24
  2. Réaliser une capture d'ecran ciblée
    Par MonsieurAk dans le forum Windows
    Réponses: 5
    Dernier message: 26/06/2006, 21h14
  3. Envoi d'une réponse XML REST par un serveur Linux
    Par MayaLeChat dans le forum REST
    Réponses: 6
    Dernier message: 08/03/2006, 14h29
  4. faire une capture d'ecran avec c++?!?
    Par hansaplast dans le forum C++
    Réponses: 4
    Dernier message: 11/01/2006, 10h44
  5. [Socket] Envoi de texte et d'objets par socket
    Par ced dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 05/08/2004, 09h07

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