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(); }
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(); }