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 :

chaine trop longue pour envoyer en socket?


Sujet :

C++Builder

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Inscrit en
    Juin 2002
    Messages
    72
    D�tails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 72
    Par d�faut [RESOLU] chaine trop longue pour envoyer en socket?
    Bonjour,
    Je cherche � envoyer un fichier par socket.
    J'ai un client qui load un fichier ds une chaine, que j'envoie au serveur, qui la sauve ds un fichier.
    Si mon fichier fait 3ko, ca passe, pas de probl�me, mais pour un fichier de 10ko, le serveur recoit la chaine et � l'arriv�e le fichier est beaucoup plus petit
    D'ou cela peut il venir, n'est il pas possible d'envoyer une chaine de 10ko via sockets? ou serait-ce la chaine en elle meme(string) qui serait limit�e?

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 138
    D�tails du profil
    Informations personnelles :
    �ge : 45
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 138
    Par d�faut
    Salut,
    Fais voir un peu le code d'envoi et de recpetion s'il te plait, sans ca celq reste beaucoup trop vqguue pour moi!
    Merci,
    A plus

  3. #3
    Membre �clair� Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    D�tails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Par d�faut
    La taille est plus petite mais au niveau du contenu tu as quoi ? Le fichier est incomplet : ou compl�tement mal rempli :

  4. #4
    Membre averti
    Inscrit en
    Juillet 2002
    Messages
    16
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 16
    Par d�faut
    utilises-tu la m�thode ReceiveBuf, ou ReceiveText ?

  5. #5
    Membre confirm�
    Inscrit en
    Juin 2002
    Messages
    72
    D�tails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 72
    Par d�faut
    J'utilise sur le client:
    ClientSocket1->Socket->SendText(chaineFic) ;

    et pour recevoir ds le serveur:
    tmp = Socket->ReceiveText();

    ensuite je d�coupe mon tmp pour le mettre ds un TSringList et j'utilise la m�thode SaveToFile de TStringList.

    Voila


    Mais il y a peut �tre mieux pour envoyer un fichier par socket... Je suis ouvert � tout autre solutions

  6. #6
    Membre confirm�
    Inscrit en
    Juin 2002
    Messages
    72
    D�tails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 72
    Par d�faut
    Alors,
    Je prend une chaine de 9000octets, j'envoie bien les 9000 octets par la socket cot� client,
    et le serveur recoit 2 trames. .. Donc tout s'emm�le D'ou le probl�me

  7. #7
    Membre �prouv�
    Profil pro
    Architecte logiciel
    Inscrit en
    Octobre 2002
    Messages
    64
    D�tails du profil
    Informations personnelles :
    Localisation : Cameroun

    Informations professionnelles :
    Activit� : Architecte logiciel

    Informations forums :
    Inscription : Octobre 2002
    Messages : 64
    Par d�faut
    salut,
    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
     
    char *Buffer = NULL;
     
     TMemoryStream *Stream = new TMemoryStream();
     
      int len = Socket->ReceiveLength();
     
      while (len > 0)
      {
        try
        {
                    Buffer = (char *)malloc(len);
                    Socket->ReceiveBuf((void *)Buffer, len);
                    Stream->Write(Buffer, strlen(Buffer));
     
        }
        __finally
        {
                     free(Buffer);
        }
     
         Stream->Seek(0, soFromBeginning);
         AnsiString LogFile = "C:\\toto.txt";
     
         Stream->SaveToFile(LogFile);
         delete Stream;
    A+.

  8. #8
    Membre confirm�
    Inscrit en
    Juin 2002
    Messages
    72
    D�tails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 72
    Par d�faut
    OK, Merci, ca a l'air trse trse bien tout ca,
    mais cot� client je garde ClientSocket1->Socket->SendText(chaineFic)?
    ou je dois faire autre chose

  9. #9
    Membre �prouv�
    Profil pro
    Architecte logiciel
    Inscrit en
    Octobre 2002
    Messages
    64
    D�tails du profil
    Informations personnelles :
    Localisation : Cameroun

    Informations professionnelles :
    Activit� : Architecte logiciel

    Informations forums :
    Inscription : Octobre 2002
    Messages : 64
    Par d�faut
    salut,

    SendText ou SendBuf Marche tres bien du cot� client ,
    le code est toujours valable dans l'evenement OnRead du Serveur.

    A+.

  10. #10
    Membre confirm�
    Inscrit en
    Juin 2002
    Messages
    72
    D�tails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 72
    Par d�faut
    J'ai tap� ca:
    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
     
    while (len > 0)
      {
        try
        {
                    Buffer = (char *)malloc(len);
                    Socket->ReceiveBuf((void *)Buffer, len);
                    Stream->Write(Buffer, strlen(Buffer));
     
        }
     
        __finally
        {
                     free(Buffer);
        }
     
     
     
      Stream->Seek(0, soFromBeginning);
     
      Stream->SaveToFile("newfic2.txt");
      delete Stream;
      }

    Le probl�me c'est que a la fin, de la 1ere boucle, on delete le stream, le len est toujours >0, et on sort de la boucle par une erreur qd on repasse ds:
    Stream->Write(Buffer, strlen(Buffer));

    car le strem est delete.


    Donc, au final, toujours une erreur, mais pour un petit fichier, on le recoit, et pour un gros, il manque toujours une partie...

  11. #11
    Membre confirm�
    Inscrit en
    Juin 2002
    Messages
    72
    D�tails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 72
    Par d�faut
    C'est bon! il suffisait juste d'actualiser le len:

    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 (len > 0)
      {
        try
        {
                    Buffer = (char *)malloc(len);
                    Socket->ReceiveBuf((void *)Buffer, len);
                    Stream->Write(Buffer, strlen(Buffer));
                    len = Socket->ReceiveLength();
        }
     
        __finally
        {
                     free(Buffer);
        }
     
     
       }
      Stream->Seek(0, soFromBeginning);
     
      Stream->SaveToFile("newfic2.txt");
      delete Stream;
    Merci!!

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

Discussions similaires

  1. [E-02] Chaine trop longue pour Validation.Add
    Par -={-_-}=- dans le forum Macros et VBA Excel
    R�ponses: 16
    Dernier message: 24/11/2008, 06h28
  2. chaine trop longue pour �tre index�e
    Par ctobini dans le forum SQL Proc�dural
    R�ponses: 6
    Dernier message: 04/10/2007, 10h36
  3. Chaines trop longues
    Par Anduriel dans le forum Langage
    R�ponses: 7
    Dernier message: 01/02/2006, 21h15
  4. Chaine trop longue
    Par valoji dans le forum Bases de donn�es
    R�ponses: 1
    Dernier message: 18/10/2005, 14h10
  5. Erreur ORA-01704 : constante de chaine trop longue
    Par verrec_s dans le forum Oracle
    R�ponses: 22
    Dernier message: 13/12/2004, 15h30

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