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# Discussion :

Envoyer un fichier via les Sockets (Problème de taille de fichier)


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 108
    Points : 55
    Points
    55
    Par défaut Envoyer un fichier via les Sockets (Problème de taille de fichier)
    Bonjour, je souhaite transférer un fichier de plus de 10Mo par les sockets, le problème c'est que mon fichier à l'arrivé est divisé en plusieurs fichiers qui oscillent entre 2 et 8Ko.
    J'ai essayé de modifier la taille du Buffer mais ça n'a rien changé, j'ai du passer à coté de quelque chose, voici mon code:

    côté 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
    23
    24
    25
    26
    27
    28
    29
     
    private int dataBufferSize = 512; public byte[] dataBuffer;
    private int bufferSize = 512; public byte[] buffer;
     
     
    public byte[] preparerMessage(message unMessage)
            {
                //serialisation de mon instance de classe en xml
                StreamWriter writer = File.CreateText(@"serializedmessage.xml");
                XmlSerializer x = new XmlSerializer(typeof(message));
                x.Serialize(writer, unMessage);
                writer.Close();
     
                // Read the file into a MemoryStream
                FileStream inStream = File.OpenRead(@"serializedmessage.xml");
                MemoryStream storeStream = new MemoryStream();
     
                // copy all data from in to store
                storeStream.SetLength(inStream.Length);
                inStream.Read(storeStream.GetBuffer(), 0, (int)inStream.Length);
     
                // clean up
                storeStream.Flush();
                inStream.Close();
     
                storeStream.Seek(0, 0);
                return storeStream.ToArray();
     
            }
    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
    29
    30
    31
    32
    33
    34
    35
            public void envoyer(byte[] unMessage)
            {
                if (!estConnecte)
                {
                    //vaffich("La connexion au serveur est interrompue,.connected");
                    return;
                }
                if (!(ClientSocket.Poll(10, SelectMode.SelectWrite) && ClientSocket.Available == 0))
                {
                    //La connexion a été clôturée par le serveur ou bien un problème réseau est apparu
                    //vaffich("La connexion au serveur est interrompue,send");
                    estConnecte = false;
                }
                else
                {
                    try
                    {
                        buffer = unMessage;
                        int DtSent = ClientSocket.Send(buffer, buffer.Length, SocketFlags.None);
                        if (DtSent == 0)
                        {
                            //vaffich("Aucune donnée n'a été envoyée");
                        }
                        else
                        {
                            //vaffich("message envoye : " + monmessage.getmessage());
                        }
                    }
                    catch (Exception ex)
                    {
                        //vaffich("La connexion au serveur est interrompue pbs :" + ex);
                        estConnecte = false;
                    }
                }
            }

    côté serveur:
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    public void lecturedelegate()
            {
                readList.Clear();
                //méthode qui permet de vérifier si données reçues boucle sur tous les sockets client
                // utilise une collection nouvelle car deconnexion possible pendant ce traitement
                for (int i = 0; i < acceptList.Count; i++)
                {
                    readList.Add((Socket)acceptList[i]);
                }
                if (readList.Count > 0) //y a t'il un client
                {
     
                    Socket.Select(readList, null, null, 1000);//ne sélectionne que les sockts prets a ici à etre lu
                    for (int i = 0; i < readList.Count; i++)
                    {
                        if (((Socket)readList[i]).Available > 0) //a t'on reçu des données de ce socket client
                        {
                            readLock = true; //bloque la possibilité de supprimer pendant ce temps ce socket si déconnexion
                            while (((Socket)readList[i]).Available > 0)
                            {
                                buffer = new byte[((Socket)readList[i]).Available];
                                ((Socket)readList[i]).Receive(buffer, buffer.Length, SocketFlags.None);
                            }
                            try
                            {
                                //génération d'un fichier xml
                                Random RandomClass = new Random();
                                int RandomNumber = RandomClass.Next();
                                string fileName = @"messages\" + RandomNumber.ToString() + @".xml";
                                FileStream writer = File.Create(fileName);
                                writer.Close();
     
                                //met le buffer dans un memory stream
                                MemoryStream ms = new MemoryStream();
                                ms.Write(buffer, 0, buffer.Length);
                                ms.Seek(0, 0);
     
                                //ecriture du fichier
                                FileStream outStream = File.OpenWrite(fileName);
                                ms.WriteTo(outStream);
                                outStream.Flush();
                                outStream.Close();
     
     
                                //deserialisation du xml
                                cpaclient.message monMessage = new cpaclient.message();
                                StreamReader reader = File.OpenText(fileName);
                                XmlSerializer x = new XmlSerializer(typeof(cpaclient.message));
                                monMessage = (cpaclient.message)x.Deserialize(reader);
                                reader.Close();
     
     
                            }
                            catch (Exception ex)
                            {
                                                        }
                        }
                        readLock = false; //on accepte de spprimer ce socket client si deconnexion
                    }
                }
            }

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 108
    Points : 55
    Points
    55
    Par défaut
    Voici d'où vien le problème, je créer à chaque fois un nouveau tableau, mais comment faire pour attendre que mon socket soit rempli puis mettre les données dans un seul buffer qui est la taille adéquate?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (((Socket)readList[i]).Available > 0)
    {
           buffer = new byte[((Socket)readList[i]).Available];
           ((Socket)readList[i]).Receive(buffer, buffer.Length, SocketFlags.None);
    }
    Adrien

  3. #3
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    C'est le moment où tu écris dans le flux que ne vas pas. Tu récupères les données puis tu les écris dans le flux et ce jusqu'à ce que tu ais tout récupéré, la méthode Receive indiquant le nombre d'octet reçus.

    Cela donnerait quelque chose dans ce genre normalement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int byteReceived;
    // On crée le tampon pour recevoir les données
    buffer = new byte[4096];
    while (true)
    {
          byteReceived = ((Socket)readList[i]).Receive(buffer, buffer.Length, SocketFlags.None);
          // Si on a tout reçu, on sort de la boucle.
          if (byteReceived == 0) { break; }
          // On écrit les données reçues dans le flux.
          monFlux.Write(buffer, 0, byteReceived);
    }
    Pas de questions techniques par MP

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 108
    Points : 55
    Points
    55
    Par défaut
    C'est le moment où tu écris dans le flux que ne vas pas. Tu récupères les données puis tu les écris dans le flux et ce jusqu'à ce que tu ais tout récupéré, la méthode Receive indiquant le nombre d'octet reçus.

    Cela donnerait quelque chose dans ce genre normalement


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int byteReceived;
    // On crée le tampon pour recevoir les données
    buffer = new byte[4096];
    while (true)
    {
          byteReceived = ((Socket)readList[i]).Receive(buffer, buffer.Length, SocketFlags.None);
          // Si on a tout reçu, on sort de la boucle.
          if (byteReceived == 0) { break; }
          // On écrit les données reçues dans le flux.
          monFlux.Write(buffer, 0, byteReceived);
    }
    Merci bien, en effet ma mémoire se remplie bien, par contre quand je suis en mode debugger, et que j'atteint le dernier bloc (quand byteReceived est inférieur à 4096), je passe bien sur le "if" puis j'écris dans la mémoire, mais ensuite je perd le point d'arrêt et je n'ai aucune erreur quand mon programme fait le dernier receive qui normalement est vide, c'est vraiment bizarre!

    Adrien

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 108
    Points : 55
    Points
    55
    Par défaut
    Bonjour,

    La méthode qui suit, attend bien que tout le flux entrant soit complet, mais lorsque le flux d'entré arrive à son terme, mon programme ne rentre pas dans le "if (byteReceived == 0) { break; }", c'est incomprehensible, le programme continu mais sans poursuivre ma méthode "public void lecturedelegate()".

    Pouvez vous m'aider svp, je ne sais plus quoi faire!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int byteReceived;
    // On crée le tampon pour recevoir les données
    buffer = new byte[4096];
    while (true)
    {
          byteReceived = ((Socket)readList[i]).Receive(buffer, buffer.Length, SocketFlags.None);
          // Si on a tout reçu, on sort de la boucle.
          if (byteReceived == 0) { break; }
          // On écrit les données reçues dans le flux.
          monFlux.Write(buffer, 0, byteReceived);
    }

  6. #6
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    C'est une erreur de ma part, il faut en fait tester le nombre d'octets reçu par rapport à la taille du buffer. Ce devrait être mieux ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int byteReceived;
    // On crée le tampon pour recevoir les données
    buffer = new byte[4096];
    while (true)
    {
          byteReceived = ((Socket)readList[i]).Receive(buffer, buffer.Length, SocketFlags.None);
          // On écrit les données reçues dans le flux.
          if (byteReceived != 0)
          {
              monFlux.Write(buffer, 0, byteReceived);
          }
          // Si on a tout reçu, on sort de la boucle.
          if (byteReceived != buffer.Length) { break; }
    }
    Pas de questions techniques par MP

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Points : 52
    Points
    52
    Par défaut
    Question technique comme ça,

    serait-il possible que le stream envoie une réponse plus petite que le bufferlength, exemple 2048 sans avoir terminé l'envoi du fichier au complet???

Discussions similaires

  1. Envoyer et recevoir des fichiers aves les Sockets
    Par kaderscream dans le forum C++Builder
    Réponses: 2
    Dernier message: 20/08/2006, 17h51
  2. erreur lors de l'envoie de donné via les socket.
    Par poporiding dans le forum C++
    Réponses: 1
    Dernier message: 23/05/2006, 14h23
  3. Manque de fichiers pour les sockets
    Par the_penguin dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 10/04/2006, 21h11
  4. ICMP Echo via les Sockets
    Par trinity.sakura dans le forum Langage
    Réponses: 4
    Dernier message: 12/09/2005, 16h01
  5. envoie de fichiers via les formulaires
    Par fabogranqi dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 10/10/2004, 21h34

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