// Отправка доступных файлов 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); }
private void DownloadButton_Click(object sender, EventArgs e) { if (PhysLayer.DsrSignal()) { DataLink.FileRecieving = true; ActionLabel.Text = "Идет загрузка файла..."; DataLink.FileRecievingName = listBox1.Text; DataLink.DownloadRequest(listBox1.Text); } }
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); }
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); }
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); } }
// Кадр для установления логического соединения с названием порта 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); }
public static void NAK() { byte[] a = pack('N'); a = DataLink.EncodeFrame(a); PhysLayer.Write(a); }
// Запрос файлов public static void RequestAvailableFiles() { byte[] a = pack('R'); a = DataLink.EncodeFrame(a); PhysLayer.Write(a); }
// Определяем пакет 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(); } } }
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); } }
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); } }
private void UpdateButton_Click(object sender, EventArgs e) { DownloadButton.Enabled = false; DataLink.RequestAvailableFiles(); ChangeFilenames(); }