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 :

R�cup�rer une image avec un socket?


Sujet :

C++Builder

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2011
    Messages
    19
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 19
    Par d�faut R�cup�rer une image avec un socket?
    Bonjour,

    je suis sur un projet informatique et j'essaie de r�cup�rer une image sur un serveur (en http). Je d�veloppe sur l'ide c++ builder 6..
    j'utilise un socket afin de r�cup�rer l'image en m�moire dans un flux, mais j'ai un probl�me:
    Lorsque j'utilise la fonction ReceiveLenght je n'arrive pas � recevoir la bonne taille de trame. Le serveur m'envoie une trame PLUS longue que ce que me retourne ReceiveLength.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void __fastcall TForm1::SocRead(TObject *Sender, TCustomWinSocket *Socket)
    {  
            int nReceived = Socket->ReceiveLength(); // nombre d'octets reçus
            char buffer[102000]; // buffer de récupération des paquets venant du serveur
     
            Socket->ReceiveBuf(buffer, nReceived);  // lis que les 200 premier caractères la plupart du temps
            pStream->Write(buffer, nReceived );       // transférer dans le stream
                                                  // pour traitement ultérieur
    }
    L'avantage c'est que je re�ois bien des donn�es, et j'ai v�rifier avec le d�bogueur je re�ois les bonnes donn�es [trame r�ponse + donn�es (image)].
    N�anmoins, je ne re�ois quasiment jamais la trame compl�te � cause de ce probl�me. Est-ce que vous savez comment r�soudre ce probl�me? avez vous une autre m�thode de r�ception d'une image � me proposer?

    Je suis preneur sur toutes les solutions que vous pourriez me proposer.
    J'attends avec impatience vos r�ponses, merci !

  2. #2
    Membre chevronn� Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par d�faut
    Je ne maitrise pas C++ buider, mais pour la programmation r�seaux j'utilise courrament les outils comme wireshark et le plugin firefox LiveHTTPheaders. Wireshark (anciennement ethereal) te permet de sniffer toutes les trames de ton ordi, ce qui permet de comprendre debugger finement les �changes r�seaux. L'outil telnet peut aussi te permettre d'envoyer des requettes � un serveur HTTP, et d'afficher le retour.

  3. #3
    Expert �minent
    Avatar de ShaiLeTroll
    Homme Profil pro
    D�veloppeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur C++\Delphi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par d�faut
    Pourquoi un socket pour un server HTTP ?
    Tu ne pouvais pas faire un GET\POST via un THTTPRio ou un TIdHTTP ?

    Sinon, c'est tout � fait normal, j'ai fait l'�quivalent en Delphi, mon code est simpliste mais lorsque tu as une connexion client qui r�cup�re une trame depuis un Serveur, �a passe si il y a une pause entre deux images

    En g�n�ral, tu vas recevoir, avec les composant TClientSocket, des paquets de 8Ko, cela correspond en g�n�ral au tampon de la carte Ethernet (et � l'impl�mentation du TCP\IP de l'OS), une fois plein, c'est l'OS qui r�cup�re le paquet et signal au socket de lire les donn�es, pendant ce temps, la carte continue a recevoir de donn�es, le tampon se remplit, l'OS le r�cup�re, je ne sais pas si il y a une limite �videmment dans l'OS de paquets stock�s, si le client ne lit pas la socket assez r�guli�rement de d�passer le tampon de windows, je ne sais pas ce qui se passe � ce moment, je ne l'ai jamais tent� !

    Par cons�quent, tu dois manuellement accumul� les suite de paquet de 8Ko jusqu'� ce qu'il n'y ait plus de donn�es !
    En g�n�ral, tu sais qu'un stream se termine par un pacquet d'une taille inf�rieure � 8Ko, puis un paquet de taille z�ro indiquant la fin d'un stream, puis le stream suivant reprend un cycle de paquet de 8Ko...

    Il arrive que deux stream arrivent de fa�on tr�s rapproch�, et l� cela peut poser probl�me car tu ne sais pas o� se termine le premier message et o� commence le second message

    Voici deux sujets (attention, il y a de nombreux liens vers d'autres sujets, la lecture de l'ensemble pourrait t'aider � mieux comprendre le protocol TCP\IP)
    Envoi donnes par socket
    Socket et envoi d'image
    Aide via F1 - FAQ - Guide du d�veloppeur Delphi devant un probl�me - Pensez-y !
    Attention Troll M�chant !
    "Quand un homme a faim, mieux vaut lui apprendre � p�cher que de lui donner un poisson" Confucius
    Mieux vaut se taire et para�tre idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la m�diocrit� !

    L'exp�rience, c'est le nom que chacun donne � ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2011
    Messages
    19
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 19
    Par d�faut
    Tout d'abord merci grandement pour votre attention face � mon soucis

    J'ai r�ussi � palier mon probl�me de base: il suffisait juste de r�cup�rer la valeur de retour de la fonction ReceiveBuf et non ReceiveLength !

    Effectivement ReceiveLength est assez mal foutu elle retourne pas les bonnes valeurs tout le temps. j'ai tout simplement fait cela:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void __fastcall TForm1::SocRead(TObject *Sender, TCustomWinSocket *Socket)
    {
            char buffer[102000]; // buffer de recuperation des paquets venant du serveur
     
            int nbLu = Socket->ReceiveBuf(buffer, 102000 );  // lire les paquets
            pStream->Write(buffer, nbLu);       // transferer dans le stream
                                                  // pour traitement ulterieur
    }
    J'avais mal �tudi� la doc de borland .
    Par contre maintenant j'essaie de d�coder cette trame et c'est pas gagner.
    J'isole le contenu de l'image et j'essaie de l'afficher sur mon IHM mais �a me met une erreur de jpeg: 'JPEG error #41'. -> Je me suis pourtant assurer d'isoler la partie de la r�ponse [de FFD8(d�but jpg) � FFD9(fin jpg)]...

    ShaiLeTroll, j'utilise un socket parce que je ne sais pas faire autrement. J'ai utilis� un TNMHTTP mais je n'arrivais pas � traiter l'image en m�moire (j'�tais oblig� de l'enregistrer sur mon disuqe dur).

    SI tu as une m�thode plus simple avec les composants que tu as cit�s je suis preneur. Un exemple d'utilisation par exemple?

    Merci encore pour tout !

  5. #5
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2011
    Messages
    19
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 19
    Par d�faut
    Voici les instructions que j'utilise:

    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
    27
    28
     
    i = 0, j = 0;
        int comp;
        unsigned char var[4], var2[4]="ÿØÿþ", tab;      // ÿØÿþ=FFD8.... 
     
        pStream->Position = 2;  
        while(pStream->Read(var,4)){
            i+=4;
            comp = strncmp(var,var2,4);
            if(comp == 0) break;
        }
        i-=2;
        pStream->Position = i;
        pStream->Read(var,4);
        pStream->Position = 0;
        while(pStream->Read(&tab,2)){
            j+=2;
            if(!strncmp(&tab,"ÿ",2)){
              pStream->Read(&tab,2);
              j+=2;
              if(!strncmp(&tab,"Ù",2)){
                break;                  //si on a FFD9 on quitte 
              }
            }
        }
        tailleImage = j - i;    //déclaré dans le .h
     
        DisplayImage();   //traite et affiche l'image
    Et voici le contenu de la fonction DisplayImage :

    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
     
      TJPEGImage* jp = new TJPEGImage;      // necessite //"jpeg.hpp"
      unsigned char buf[100000];
     
     
      try
      {
        pFluxImage->Position = 0;
        pStream->Position = i;// debut code jpeg après le Header dans le stream
        pStream->Read(buf, tailleImage);
        pFluxImage->Write(buf, tailleImage);
        jp->LoadFromStream(pFluxImage);     // charger le jpeg converti en bitmap
        Image1->Picture->Assign(jp); // afficher l'image
        Application->ProcessMessages();  //à partir de ce moment: message d'erreur...
      }
      catch (...)
      {
        MessageBeep(0);
      }
      delete jp;            // liberer la memoire

  6. #6
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2011
    Messages
    19
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 19
    Par d�faut
    petit up please

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 2
    Dernier message: 02/09/2014, 15h11
  2. R�ponses: 4
    Dernier message: 29/10/2010, 14h40
  3. r�cup�rer une image avec readfile
    Par julien1451 dans le forum Langage
    R�ponses: 11
    Dernier message: 27/01/2010, 01h06
  4. R�cup�rer taille d'une image avec IE
    Par olbouss dans le forum jQuery
    R�ponses: 5
    Dernier message: 03/11/2009, 09h20
  5. R�ponses: 4
    Dernier message: 07/06/2006, 14h23

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