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 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