コード例 #1
0
        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();
        }
コード例 #2
0
        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();
        }
コード例 #3
0
        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();
        }