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

  1. #1
    Membre du Club
    Inscrit en
    Juin 2002
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 72
    Points : 50
    Points
    50
    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 expérimenté

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 138
    Points : 1 504
    Points
    1 504
    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 actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    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 à l'essai
    Inscrit en
    Juillet 2002
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 16
    Points : 22
    Points
    22
    Par défaut
    utilises-tu la méthode ReceiveBuf, ou ReceiveText ?

  5. #5
    Membre du Club
    Inscrit en
    Juin 2002
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 72
    Points : 50
    Points
    50
    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 du Club
    Inscrit en
    Juin 2002
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 72
    Points : 50
    Points
    50
    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 régulier
    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
    Points : 88
    Points
    88
    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 du Club
    Inscrit en
    Juin 2002
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 72
    Points : 50
    Points
    50
    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 régulier
    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
    Points : 88
    Points
    88
    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 du Club
    Inscrit en
    Juin 2002
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 72
    Points : 50
    Points
    50
    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 du Club
    Inscrit en
    Juin 2002
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 72
    Points : 50
    Points
    50
    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