示例#1
0
        public void DownloadFile()
        {
            // Définition des variables pour la méthode Download
            int bLen = 516;

            byte[] file = new byte[516];

            // Encoder la première trame
            InitDownloadEncoding();

            // Ouverture du fichier avec Filestream
            try
            {
                fs = new FileStream(lFileDownload, FileMode.Create, FileAccess.Write, FileShare.Read);
            }
            catch (Exception e)
            {
                f.Invoke(f.ServerStatus, new object[] { string.Format("Il y a eu une erreur lors de la création du fichier {0}", lFileDownload) });
                return;
            }
            f.Invoke(f.ServerStatus, new object[] { string.Format("Ouverture du fichier à lire {0}", lFileDownload) });

            // Envoyer de la demande de download
            SendToServer();

            // Réception de l'accord pour download
            try
            {
                bLen = sDownload.ReceiveFrom(bTamponReception, ref pointDistantDownload);
            }
            catch (Exception se)
            {
                f.Invoke(f.ServerStatus, new object[] { string.Format("Il y a eu une erreur lors de la réception", se.Message.ToString()) });
                return;
            }

            f.Invoke(f.ServerStatus, new object[] { "Début du transfert..." });

            // Est-ce qu'il faut changer de port et interchanger le point local du point distant?

            // Transfert de blocks
            do
            {
                // On reçoit le block suivant
                if ((((bTamponReception[2] << 8) & 0xff00) | bTamponReception[3]) == nBlock)
                {
                    // Écrire les données reçues dans le fichier correspondant
                    fs.Write(bTamponReception, 4, bLen - 4);

                    // Envoi d'un ack au serveur pour confirmer la réception
                    SendDataAck();
                    nBlock++;
                }

                // On attend de voir si c'est le dernier block
                if (bLen == 516)
                {
                    // Réception du prochain packet de données
                    try
                    {
                        bLen = sDownload.ReceiveFrom(bTamponReception, ref pointDistantDownload);
                    }
                    catch (Exception e)
                    {
                        f.Invoke(f.ServerStatus, new object[] { string.Format("Il y a eu une erreur lors de la réception du block de données ", e.Message) });
                        return;
                    }
                    // On envoie un autre Ack si c'est le dernier block
                }
            }

            // S'il y a une erreur, récupérer le type et l'afficher
            if (bTamponReception[1] == 5)
            {
                f.Invoke(f.ServerStatus, new object[] { string.Format("Il y a eu une erreur lors du transfert {0}", Encoding.GetEncoding(437).GetString(bTamponReception, 4, bTamponReception.Length - 5).Trim('\0')) });
                return;
            }
            // Envoi du dernier ACK pour terminer le transfert
            SendDataAck();
            // Fermer le socket et le fichier pour terminer le transfert
            f.Invoke(f.ServerStatus, new object[] { string.Format("Total de blocs transférés : {0} reçus de {1}", nBlock, pointDistantDownload.ToString()) });
            f.Invoke(f.ServerStatus, new object[] { "Le transfert s'est terminé avec succès ! \r\n" });
            sDownload.Close();
            fs.Close();
        }
示例#2
0
        public void UploadFile()
        {
            // Définition des variables du thread
            int bLen = 516;

            byte[] file = new byte[516];

            if (File.Exists(lFileUpload)) // Vérification de l'existence du fichier local avant de le lire.
            {
                // Encoder la trame initiale pour l'Upload
                initUploadEncoding();
                // Envoi de la demande d'Upload
                sendToServer();

                // Réception de l'accord pour Upload
                try
                {
                    sUpload.ReceiveFrom(bTamponReception, ref PointLocalUpload);
                }
                catch (Exception se)
                {
                    f.Invoke(f.ServerStatus, new object[] { string.Format("Il y a eu une erreur lors de la réception : ", se.Message) });
                }

                // Ouverture du fichier avec un filestream
                fs = File.Open(lFileUpload, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

                f.Invoke(f.ServerStatus, new object[] { string.Format("Ouverture du fichier à lire : {0}", lFileUpload) });
                f.Invoke(f.ServerStatus, new object[] { "Début du transfert..." });
                // Boucle de thread de transfert de blocks vers le serveur
                while (bTamponReception[1] != 5 && bLen == 516)
                {
                    if (bTamponReception[1] == 4 && (((bTamponReception[2] << 8) & 0xff00) | bTamponReception[3]) == nBlock)
                    {
                        file  = new byte[512];
                        nRead = 0;
                        // Encoder la trame contenant le fichier à transmettre
                        nRead = fs.Read(file, 0, 512);
                        nBlock++;
                        dataEncoding(nBlock, file);

                        //Envoi de la trame avec le contenu du fichier
                        try
                        {
                            bLen = sUpload.SendTo(bTrame, bTrame.Length, SocketFlags.None, PointLocalUpload);
                        }
                        catch (SocketException se)
                        {
                            f.Invoke(f.ServerStatus, new object[] { string.Format("Il y a eu une erreur lors de la transmission : ", se.Message) });
                            return;
                        }
                    }
                    // Réception de la trame avec le bon # de bloc correspondant
                    try
                    {
                        sUpload.ReceiveFrom(bTamponReception, ref PointLocalUpload);
                    }
                    catch (SocketException se)
                    {
                        f.Invoke(f.ServerStatus, new object[] { string.Format("Il y a eu une erreur lors de la réception : ", se.Message) });
                        return;
                    }
                }
                f.Invoke(f.ServerStatus, new object[] { string.Format("Total de blocs transférés : {0} envoyés à {1}", nBlock, PointDistantUpload.ToString()) });
                f.Invoke(f.ServerStatus, new object[] { "Le transfert s'est terminé avec succès ! \r\n" });
            }
            else // Quand le fichier local n'existe pas
            {
                f.Invoke(f.ServerStatus, new object[] { string.Format("Le fichier local n'existe pas : ", lFileUpload) });
                return;
            }
            fs.Close();
            sUpload.Close();
        }