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 :

[socket] Transfert de fichier, Bug d'envoi des BYTE


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 113
    Points : 45
    Points
    45
    Par défaut [socket] Transfert de fichier, Bug d'envoi des BYTE
    salut,
    Je poste pour un problème de transfert des blocs de Byte. Par exemple quand j'envoie une image de 5 mo, décomposée en Byte où le buffer size=4000, arrivé à l'envoie du 10ème, ça bloque!

    voici un extrait de code d'envoie de l'image :
    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
     
     const int BUFFER_SIZE = 4000;
    //récuperation fichier image
        FileStream fichier = new FileStream(fileName, FileMode.Open, FileAccess.Read);
     
     
     
                            //header sert d'identifiant (  peut être une image,un fichier ...)
                            string header = "IMG_"+openFileDialog1.SafeFileName+"?";
     
                            // fin d'envoie d'un fichier (symbole :)
                            string end = "IMG_" + openFileDialog1.SafeFileName + ":";
     
                            byte[] headerb = Encoding.Unicode.GetBytes(header);
                            byte[] endb = Encoding.Unicode.GetBytes(end);
     
                            //construction buffer vers le réseau 
                            byte[] contenu = new byte[BUFFER_SIZE];
                            byte[] morceau = new byte[headerb.Length+BUFFER_SIZE];
                            byte[]morceauFin=new byte[endb.Length+BUFFER_SIZE];
                            int tailleBit=0;
                            int totalLu=0;
     
                            NetworkStream nfs=new NetworkStream(socket);
                            int i = 0;
                            //boucle d'envoie des groupes de BYTE
                            while (totalLu < fichier.Length && nfs.CanWrite)
                            {   
                               //recuperation BYTE
                               tailleBit = fichier.Read(contenu, 0, contenu.Length);
     
                                   // Copie du header
                                   for (i = 0; i < headerb.Length; i++)
                                       morceau[i] = headerb[i];
     
                                   //copie header + fichier 
                                   for (int j = 0; i < contenu.Length; j++, i++)
                                       morceau[i] = contenu[j];
     
                                   //ecriture sur socket
                                   nfs.Write(morceau, 0, tailleBit + headerb.Length);
                                   totalLu = totalLu + tailleBit;
                               }
    En gros voilà comment , j'envoie l'image
    Tant Que la taille de fichier n'est pas atteinte par totalLu, je continue à envoyer les groupe de BYTE, sachant que chaque groupe est composé d'un header (identifiant) avec son type (IMG) et son nom!



    et là c'est le code de récupération

    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
     
    //fichier ou image à reconstruire
    FileStream fs = new FileStream("image", FileMode.Create, FileAccess.Write, FileShare.None);
    while (true)
                {
                    boolFin = false;
                    p = 0;
                    result = null;
                    chaineBit = null;
                    try
                    {
                        if (sock != null)
                        {
                            byte[] b = new byte[BUFFER_SIZE];
     
                            int k = ((Socket)sock).Receive(b);
     
                            chaineBit = Encoding.UTF8.GetString(b);
                            //on regarde si chaine commence par IMG
                            if (chaineBit.StartsWith("I"))
                            {
                                while (boolFin != true)
                                {
                                    char c = Convert.ToChar(b[p]);
     
                                    result += Convert.ToChar(b[p]);
                                    if (c.ToString().Equals("?"))
                                    {
                                        //suppression du header du BYTE
                                        string chaineCoupe = chaineBit.Remove(0, result.Length);
                                        byte[] blocImgBit = Encoding.Unicode.GetBytes(chaineCoupe);
                                        // Ecriture du bloc dans le fichier
                                        fs.Write(blocImgBit, 0, blocImgBit.Length);
                                        boolFin = true;
                                    }
     
                                    p++;
                                }
    En gros là , je récupère un bloc, je retire le header, et j'écris dans FS!!


    Donc mon soucis est que dans l'itération d'envoie des BYTE, ça se bloque vers l'envoie du 10 ème paquet!!
    Je sais pas pourquoi, peut-être que la socket est saturée???
    Quelqun a une idée?

  2. #2
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 113
    Points : 45
    Points
    45
    Par défaut
    ne faut-il pas faire une pause entre chaque envoie peut-être pour éviter la saturation???

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/12/2008, 23h42
  2. Socket: transfert de fichiers
    Par timtima dans le forum Réseau
    Réponses: 5
    Dernier message: 28/11/2007, 12h54
  3. [Sockets] transfert de fichier client/serveur
    Par alex6891 dans le forum Développement
    Réponses: 6
    Dernier message: 20/03/2006, 16h14
  4. [Socket]Transfert données + fichier
    Par willowII dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 17/08/2005, 23h08
  5. [Socket]Transfert de fichier
    Par Aminos dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 19/04/2003, 13h58

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