private void SendErreur(EndPoint pd) { Socket so = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); cTrame ad = new cTrame(); so.SendTo(ad.Erreur("Operation TFTP illegale"), pd); so.Close(); }
private void thW() { FileStream fs; byte[] databloc = new byte[516]; int bLue = 0; cTrame trame = new cTrame(); Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); s.ReceiveTimeout = 1; EndPoint pl = new IPEndPoint(0, 0); s.Bind(pl); UInt16 bloc = 0; UInt16 blocSuivant = 1; int retry = 0; if (_fichier != null) { if (File.Exists(_fichier)) { fs = null; s.SendTo(trame.Erreur("Fichier existe deja"), SocketFlags.None, _pd); _bThread = false; } else { fs = new FileStream(_fichier, FileMode.Create, FileAccess.Write); _bThread = true; } } else { fs = null; s.SendTo(trame.Erreur("Nom de fichier vide"), SocketFlags.None, _pd); _bThread = false; } while (_bThread) { s.SendTo(trame.do_ACK(bloc), 4, SocketFlags.None, _pd); s.Poll(3000000, SelectMode.SelectRead); if (s.Available > 0) { bLue = s.Receive(databloc, SocketFlags.None); } if (trame.is_DATA((blocSuivant), databloc)) { byte[] a = databloc.Skip(4).ToArray(); fs.Write(a, 0, a.Length); retry = 0; bloc++; blocSuivant++; if (bLue < 512) { _bThread = false; s.SendTo(trame.do_ACK(bloc), 4, SocketFlags.None, _pd); fs.Close(); } } else { retry++; } if (retry == 3) { _bThread = false; fs.Close(); File.Delete(_fichier); s.SendTo(trame.Erreur("Erreur de transmission"), _pd); } } s.Close(); }
private void thR() { byte[] databloc = new byte[512]; int bLue = 0; cTrame trame = new cTrame(); Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); FileStream fs; EndPoint pl = new IPEndPoint(0, 0); s.Bind(pl); UInt16 bloc = 1; int retry = 0; byte[] ack = new byte[50]; //Regarde si le fichier existe if (File.Exists(_fichier)) { _bThread = true; fs = new FileStream(_fichier, FileMode.Open, FileAccess.Read); } else { //S'il n'existe pas mets les data a zero pour sauter la boucle et referme le socket //Envoie msg erreur 01 s.SendTo(trame.Erreur(1), SocketFlags.None, _pd); fs = null; } while (_bThread) { //les un bloc de data de max 512 byte, selon le bloc a envoyer /*Si bloc = 1 skip(0) donc commence au debut et en prend 512 * bloc = 2 skip(512) et en prend 512 * ... * jusqu'a ce que le skip soit egale a la longeur fichier * */ bLue = fs.Read(databloc, 0, 512); s.SendTo(trame.do_DATA(bloc, databloc.Take(bLue).ToArray()), SocketFlags.None, _pd); s.Poll(3000000, SelectMode.SelectRead); s.Receive(ack); if (trame.is_ACK(bloc, ack)) { retry = 0; bloc++; if (bLue < 512) { _bThread = false; fs.Close(); } } else { retry++; } if (retry == 3) { s.SendTo(trame.Erreur("Nombre essai trop élever"), SocketFlags.None, _pd); _bThread = false; } } s.Close(); }