Пример #1
0
        // Отправка доступных файлов
        public static void SendAvailableFiles()
        {
            // список для имен файлов по байтам
            List <byte> f = new List <byte>();

            // достаем все файлы с рабочего стола
            string desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

            string[] files = Directory.GetFiles(desktop);

            foreach (string str in files)
            {
                // делаем массив байтов для каждого файла
                byte[] fBytes = Encoding.Default.GetBytes(Path.GetFileName(str) + "?");

                //побайтово кладем в массив
                foreach (byte b in fBytes)
                {
                    f.Add(b);
                }
            }

            byte[] a = pack('F', f.ToArray());
            a = DataLink.EncodeFrame(a);
            PhysLayer.Write(a);
        }
Пример #2
0
 private void DownloadButton_Click(object sender, EventArgs e)
 {
     if (PhysLayer.DsrSignal())
     {
         DataLink.FileRecieving     = true;
         ActionLabel.Text           = "Идет загрузка файла...";
         DataLink.FileRecievingName = listBox1.Text;
         DataLink.DownloadRequest(listBox1.Text);
     }
 }
Пример #3
0
        public static void StartSendingFile(File F)
        {
            List <byte> f = new List <byte>();

            byte[] fBytes = Encoding.Default.GetBytes(Convert.ToString(F.Size));

            foreach (byte b in fBytes)
            {
                f.Add(b);
            }

            byte[] a = pack('S', f.ToArray());
            a = DataLink.EncodeFrame(a);
            PhysLayer.Write(a);
        }
Пример #4
0
        public static void DownloadRequest(string FileName)
        {
            List <byte> f = new List <byte>();

            // делаем массив байтов для названия файла
            byte[] fBytes = Encoding.Default.GetBytes(FileName);

            foreach (byte b in fBytes)
            {
                f.Add(b);
            }

            byte[] a = pack('D', f.ToArray());
            a = DataLink.EncodeFrame(a);
            PhysLayer.Write(a);
        }
Пример #5
0
        private static void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            List <byte> recievedList = new List <byte>();

            while (serialPort.BytesToRead > 0)
            {
                byte a = Convert.ToByte(serialPort.ReadByte());
                recievedList.Add(a);
            }

            byte[] recievedArray = recievedList.ToArray();
            if (recievedArray.Length != 0)
            {
                DataLink.Analyze(recievedArray);
            }
        }
Пример #6
0
        // Кадр для установления логического соединения с названием порта
        public static void EstablishConnection()
        {
            List <byte> f = new List <byte>();

            // делаем массив байтов для имени порта
            byte[] fBytes = Encoding.Default.GetBytes(PhysLayer.GetPortName());

            //побайтово кладем в массив
            foreach (byte b in fBytes)
            {
                f.Add(b);
            }

            byte[] a = pack('E', f.ToArray());
            a = DataLink.EncodeFrame(a);
            PhysLayer.Write(a);
        }
Пример #7
0
 public static void NAK()
 {
     byte[] a = pack('N');
     a = DataLink.EncodeFrame(a);
     PhysLayer.Write(a);
 }
Пример #8
0
 // Запрос файлов
 public static void RequestAvailableFiles()
 {
     byte[] a = pack('R');
     a = DataLink.EncodeFrame(a);
     PhysLayer.Write(a);
 }
Пример #9
0
        // Определяем пакет
        public static void Analyze(byte[] recievedArray)
        {
            try
            {
                recievedArray = DataLink.DecodeFrame(recievedArray);
                if (recievedArray[0] == Convert.ToByte('F'))
                {
                    if (recievedArray[1] == Constants.BORDER)
                    {
                        List <byte> filesList = new List <byte>();
                        for (int i = 2; i < recievedArray.Length; i++)
                        {
                            if (recievedArray[i] == Constants.BORDER)
                            {
                                break;
                            }
                            filesList.Add(recievedArray[i]);
                        }

                        string fileString = Encoding.Default.GetString(filesList.ToArray());
                        DataLink.files        = fileString.Split('?');
                        DataLink.filesUpdated = true;
                    }
                }

                if (recievedArray[0] == Convert.ToByte('E'))
                {
                    if (recievedArray[1] == Constants.BORDER)
                    {
                        List <byte> PortNameBytes = new List <byte>();
                        for (int i = 2; i < recievedArray.Length; i++)
                        {
                            if (recievedArray[i] == Constants.BORDER)
                            {
                                break;
                            }
                            PortNameBytes.Add(recievedArray[i]);
                        }

                        string PortName = Encoding.Default.GetString(PortNameBytes.ToArray());
                        PhysLayer.PortReciever = PortName;
                    }
                }

                if (recievedArray[0] == Convert.ToByte('R'))
                {
                    DataLink.SendAvailableFiles();
                }

                if (recievedArray[0] == Convert.ToByte('D'))
                {
                    if (recievedArray[1] == Constants.BORDER)
                    {
                        List <byte> FileNameBytes = new List <byte>();
                        for (int i = 2; i < recievedArray.Length; i++)
                        {
                            if (recievedArray[i] == Constants.BORDER)
                            {
                                break;
                            }
                            FileNameBytes.Add(recievedArray[i]);
                        }

                        string FileName = Encoding.Default.GetString(FileNameBytes.ToArray());

                        try
                        {
                            string Desktop  = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                            string fullPath = Desktop + "\\" + FileName;

                            if (System.IO.File.Exists(fullPath))
                            {
                                FileInfo I = new FileInfo(fullPath);
                                File     F = new File(fullPath, I.Length);
                                SendQueue.Enqueue(F);
                            }

                            else
                            {
                                FileNotFound();
                            }
                        }
                        catch (Exception)
                        {
                        }
                    }
                }

                if (recievedArray[0] == Convert.ToByte('S'))
                {
                    if (recievedArray[1] == Constants.BORDER)
                    {
                        List <byte> SizeBytes = new List <byte>();
                        for (int i = 2; i < recievedArray.Length; i++)
                        {
                            if (recievedArray[i] == Constants.BORDER)
                            {
                                break;
                            }
                            SizeBytes.Add(recievedArray[i]);
                        }

                        string Size = Encoding.Default.GetString(SizeBytes.ToArray());
                        DataLink.FileRecievingSize = Convert.ToInt32(Size);

                        PhysLayer.FramesRecieved.Enqueue(Encoding.Default.GetBytes("SIZE"));
                        ACK();
                    }
                }

                // Квитанции

                if (recievedArray[0] == Convert.ToByte('A'))
                {
                    PhysLayer.Responses.Enqueue(recievedArray[0]);
                }

                // Инфокадр!
                if (recievedArray[0] == Convert.ToByte('I'))
                {
                    List <byte> InfoBytes = new List <byte>();
                    for (int i = 1; i < recievedArray.Length; i++)
                    {
                        InfoBytes.Add(recievedArray[i]);
                    }
                    PhysLayer.FramesRecieved.Enqueue(InfoBytes.ToArray());
                    ACK();
                }

                if (recievedArray[0] == Convert.ToByte('Z') || recievedArray[0] == Convert.ToByte('X'))
                {
                    List <byte> InfoBytes = new List <byte>();

                    for (int i = 1; i < recievedArray.Length; i++)
                    {
                        InfoBytes.Add(recievedArray[i]);
                    }
                    PhysLayer.FramesRecieved.Enqueue(InfoBytes.ToArray());
                }
            }
            catch (Exception)
            {
                if (DataLink.FileRecieving)
                {
                    NAK();
                }
            }
        }
Пример #10
0
        private void ConnectionWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                if (PhysLayer.DsrSignal())
                {
                    label3.Invoke((MethodInvoker) delegate
                    {
                        label3.Text      = "Соединение активно";
                        label3.ForeColor = Color.Green;
                    });

                    UpdateButton.Invoke((MethodInvoker) delegate
                    {
                        if (!DataLink.FileRecieving && !DataLink.FileSending)
                        {
                            UpdateButton.Enabled = true;
                        }
                        else
                        {
                            UpdateButton.Enabled = false;
                        }
                    });

                    ActionLabel.Invoke((MethodInvoker) delegate
                    {
                        if (!DataLink.FileRecieving && !DataLink.FileSending)
                        {
                            ActionLabel.Text = "";
                        }
                    });

                    // Если есть соединение логическое, то пишем название порта к которому подключены
                    if (PhysLayer.PortReciever != "" && DataLink.Connection)
                    {
                        label1.Invoke((MethodInvoker) delegate
                        {
                            label1.Text = "Подключение через " + PhysLayer.GetPortName() + " к " + PhysLayer.PortReciever;
                        });
                    }
                    else
                    {
                        label1.Invoke((MethodInvoker) delegate
                        {
                            label1.Text = "Подключен к порту " + PhysLayer.GetPortName();
                        });

                        if (!DataLink.Connection)
                        {
                            DataLink.EstablishConnection();
                            DataLink.Connection = true;
                        }
                    }
                }
                else
                {
                    label3.Invoke((MethodInvoker) delegate
                    {
                        label3.Text      = "Соединение отсутствует";
                        label3.ForeColor = Color.Red;
                    });

                    UpdateButton.Invoke((MethodInvoker) delegate
                    {
                        UpdateButton.Enabled = false;
                    });

                    label1.Invoke((MethodInvoker) delegate
                    {
                        if (PhysLayer.IsOpen())
                        {
                            label1.Text = "Подключен к порту " + PhysLayer.GetPortName();
                        }
                        else
                        {
                            label1.Text = "Порт закрыт";
                        }
                    });

                    progressBar1.Invoke((MethodInvoker) delegate
                    {
                        progressBar1.Value = 0;
                    });

                    ActionLabel.Invoke((MethodInvoker) delegate
                    {
                        ActionLabel.Text = "";
                    });

                    DataLink.Connection    = false;
                    PhysLayer.PortReciever = "";
                }

                System.Threading.Thread.Sleep(1000);
            }
        }
Пример #11
0
        private void TransmittingWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                if (!DataLink.FileSending && !DataLink.FileRecieving)
                {
                    if (!DataLink.SendQueue.IsEmpty)
                    {
                        File F;
                        if (DataLink.SendQueue.TryDequeue(out F))
                        {
                            DataLink.FileSending = true;
                            DataLink.StartSendingFile(F);

                            /****** установка элементов формы ******/

                            DownloadButton.Invoke((MethodInvoker) delegate
                            {
                                DownloadButton.Enabled = false;
                            });

                            progressBar1.Invoke((MethodInvoker) delegate
                            {
                                progressBar1.Maximum = (int)(F.Size / 1024);
                            });

                            ActionLabel.Invoke((MethodInvoker) delegate
                            {
                                ActionLabel.Text = "Идет передача файла...";
                            });

                            /**************************************/

                            FileStream Stream = new FileStream(F.Name, FileMode.Open, FileAccess.Read);
                            byte       R;
                            byte[]     buffer = new byte[1024];

                            int counter = 0; // счетчик ошибок

                            while (DataLink.FileSending)
                            {
                                if (!PhysLayer.DsrSignal())
                                {
                                    Stream.Close();
                                    MessageBox.Show("Ошибка передачи!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                    PhysLayer.ShutDown();
                                }

                                if (PhysLayer.Responses.TryDequeue(out R))
                                {
                                    if (R == Convert.ToByte('A'))
                                    {
                                        counter = 0;
                                        try
                                        {
                                            int BytesRead = Stream.Read(buffer, 0, buffer.Length);
                                            if (BytesRead > 0)
                                            {
                                                byte[] clean = new byte[BytesRead];
                                                for (int i = 0; i < BytesRead; i++)
                                                {
                                                    clean[i] = buffer[i];
                                                }

                                                int step = clean.Length;

                                                clean = DataLink.pack('I', clean);
                                                clean = DataLink.EncodeFrame(clean);
                                                PhysLayer.Write(clean);

                                                progressBar1.Invoke((MethodInvoker) delegate
                                                {
                                                    progressBar1.Step = step / 1024;
                                                    progressBar1.PerformStep();
                                                });
                                            }

                                            else
                                            {
                                                Stream.Close();
                                                DataLink.EOF();
                                                DataLink.FileSending = false;

                                                progressBar1.Invoke((MethodInvoker) delegate
                                                {
                                                    progressBar1.Value = 0;
                                                });

                                                ActionLabel.Invoke((MethodInvoker) delegate
                                                {
                                                    ActionLabel.Text = "";
                                                });

                                                MessageBox.Show("Передача файла завершена!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.None);
                                            }
                                        }

                                        catch (ArgumentException)
                                        {
                                            MessageBox.Show("ISKLUCHENIE");
                                        }
                                    }

                                    if (R == Convert.ToByte('N'))
                                    {
                                        if (counter < 5)
                                        {
                                            counter++;
                                            PhysLayer.Write(buffer);
                                        }

                                        else
                                        {
                                            MessageBox.Show("Ошибка передачи!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);

                                            PhysLayer.ShutDown();
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                if (DataLink.FileRecieving)
                {
                    DownloadButton.Invoke((MethodInvoker) delegate
                    {
                        DownloadButton.Enabled = false;
                    });

                    string desktop  = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                    string fullPath = desktop + "\\(NEW)" + DataLink.FileRecievingName;

                    FileStream Stream = new FileStream(fullPath, FileMode.Create, FileAccess.Write);

                    while (DataLink.FileRecieving)
                    {
                        if (!PhysLayer.DsrSignal())
                        {
                            Stream.Close();
                            System.IO.File.Delete(fullPath);
                            MessageBox.Show("Ошибка передачи!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            PhysLayer.ShutDown();
                        }

                        byte[] result;

                        if (PhysLayer.FramesRecieved.TryDequeue(out result))
                        {
                            if (Encoding.Default.GetString(result) == "EOF")
                            {
                                Stream.Close();
                                DataLink.FileRecieving = false;

                                MessageBox.Show("Прием файла завершен!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.None);

                                progressBar1.Invoke((MethodInvoker) delegate
                                {
                                    progressBar1.Value = 0;
                                });

                                break;
                            }

                            if (Encoding.Default.GetString(result) == "FNF")
                            {
                                Stream.Close();
                                System.IO.File.Delete(fullPath);

                                progressBar1.Invoke((MethodInvoker) delegate
                                {
                                    progressBar1.Value = 0;
                                });

                                PhysLayer.ShutDown();
                                MessageBox.Show("Файл не найден.\r\nВыберите другой файл.", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);

                                break;
                            }

                            if (Encoding.Default.GetString(result) == "SIZE")
                            {
                                progressBar1.Invoke((MethodInvoker) delegate
                                {
                                    progressBar1.Maximum = DataLink.FileRecievingSize / 1024;
                                });
                            }

                            else
                            {
                                try
                                {
                                    Stream.Write(result, 0, result.Length);

                                    progressBar1.Invoke((MethodInvoker) delegate
                                    {
                                        progressBar1.Step = result.Length / 1024;
                                        progressBar1.PerformStep();
                                    });
                                }

                                catch (IOException)
                                {
                                    MessageBox.Show("Ошибка передачи!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                    PhysLayer.ShutDown();

                                    progressBar1.Invoke((MethodInvoker) delegate
                                    {
                                        progressBar1.Value = 0;
                                    });
                                }
                            }
                        }
                    }

                    Stream.Close();
                    PhysLayer.ShutDown();
                }

                DownloadButton.Invoke((MethodInvoker) delegate
                {
                    if (listBox1.Text != "")
                    {
                        DownloadButton.Enabled = true;
                    }
                });

                Thread.Sleep(1000);
            }
        }
Пример #12
0
 private void UpdateButton_Click(object sender, EventArgs e)
 {
     DownloadButton.Enabled = false;
     DataLink.RequestAvailableFiles();
     ChangeFilenames();
 }