public void GetData(int typeId) { FrameType type = (FrameType)typeId; byte[] ToDecode; byte[] Decoded; /*Log.Invoke(new EventHandler(delegate * { * Log.AppendText("get frame " + type +"\n"); * }));*/ switch (type) { case FrameType.MSG: #region MSG if (IsConnected()) { int n = Port.BytesToRead; byte[] msgByteBuffer = new byte[n]; Port.Read(msgByteBuffer, 0, n); //считываем сообщение string Message = Encoding.Default.GetString(msgByteBuffer); Log.Invoke(new EventHandler(delegate { Log.AppendText("(" + Port.PortName + ") GetData: new message > " + Message + "\n"); })); WriteData(null, FrameType.ACK); } else { WriteData(null, FrameType.RET_MSG); } break; #endregion case FrameType.FILEOK: #region FILEOK if (IsConnected()) { int n = Port.BytesToRead; byte[] msgByteBuffer = new byte[n]; Port.Read(msgByteBuffer, 0, n); //считываем сообщение string Message = Encoding.Default.GetString(msgByteBuffer); Log.Invoke(new EventHandler(delegate { Log.AppendText("[" + DateTime.Now + "] : Получено предложение на прием файла размером: " + Message + "\n"); })); //SuccessfulFrameNumber = int.Parse(Message); if (MessageBox.Show("Файл. Размер: " + Message + " Кбайт.\nПринять?", "Прием файла", MessageBoxButtons.YesNo) == DialogResult.Yes) { WriteData(null, FrameType.ACK); } } else { WriteData(null, FrameType.RET_MSG); } break; #endregion case FrameType.FRAME: #region FRAME //if (IsConnected()) //{ // int n = Port.BytesToRead; // byte[] msgByteBuffer = new byte[n]; // Port.Read(msgByteBuffer, 0, n); //считываем сообщение // string Message = Encoding.Default.GetString(msgByteBuffer); // Log.Invoke(new EventHandler(delegate // { // Log.AppendText("[" + DateTime.Now + "] : Получено подтверждение об успешной доставке Frame " + Message + "\n"); // })); // SuccessfulFrameNumber = int.Parse(Message); // WriteData(null, FrameType.FILE); //} //else //{ // WriteData(null, FrameType.RET_MSG); //} //break; #endregion case FrameType.FILE: #region FILE if (IsConnected()) { byte fileId = (byte)Port.ReadByte(); string typeFile = TypeFileAnalysis(fileId); byte[] size = new byte[sizeLenght]; Port.Read(size, 0, sizeLenght); int ssize = (int)Double.Parse(Encoding.Default.GetString(size)); byte[] byte_NumOfFrames = new byte[NumOfFrameLenght]; Port.Read(byte_NumOfFrames, 0, NumOfFrameLenght); int NumOfFrames = (int)Double.Parse(Encoding.Default.GetString(byte_NumOfFrames)); byte[] byte_FrameNumber = new byte[NumOfFrameLenght]; Port.Read(byte_FrameNumber, 0, NumOfFrameLenght); int FrameNumber = (int)Double.Parse(Encoding.Default.GetString(byte_FrameNumber)); if (FrameNumber == 1) { DialogResult result; double fileSize = Math.Round((double)ssize / 1024, 3); result = MessageBox.Show("Файл. Размер: " + fileSize.ToString() + " Кбайт.\nПринять?", "Прием файла", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) { file_buffer = new byte[NumOfFrames * (Port.WriteBufferSize - 27)]; } else { Display.Invoke(new EventHandler(delegate { Display.AppendText( "[" + DateTime.Now + "] : " + ": " + "Вы не сохранили файл" + "\r\n"); Display.ScrollToCaret(); })); } } int n = Port.WriteBufferSize - InfoLen; byte[] newPart = new byte[n]; Port.Read(newPart, 0, n); newPart.CopyTo(file_buffer, n * (FrameNumber - 1)); if (FrameNumber == NumOfFrames) { Decoded = new byte[ssize]; ToDecode = new byte[2]; for (int i = 0; i < ssize; i++) { ToDecode[0] = file_buffer[i * 2]; ToDecode[1] = file_buffer[(i * 2) + 1]; Decoded[i] = Hamming.Decode(ToDecode); } SaveFileDialog saveFileDialog = new SaveFileDialog(); MainForm.Invoke(new EventHandler(delegate { saveFileDialog.FileName = ""; saveFileDialog.Filter = "TypeFile (*." + typeFile + ")|*." + typeFile + "|All files (*.*)|*.*"; if (DialogResult.OK == saveFileDialog.ShowDialog()) { File.WriteAllBytes(saveFileDialog.FileName, Decoded); WriteData(null, FrameType.ACK); Display.Invoke(new EventHandler(delegate { Display.AppendText( "[" + DateTime.Now + "] : " + "Файл успешно получен" + "\r\n"); Display.ScrollToCaret(); })); } else { // MessageBox.Show("Отмена "); Display.Invoke(new EventHandler(delegate { Display.AppendText( "[" + DateTime.Now + "] : " + ": " + "Вы не сохранили файл" + "\r\n"); Display.ScrollToCaret(); })); } })); } WriteData(FrameNumber.ToString(), FrameType.FRAME); } else { WriteData(null, FrameType.RET_FILE); } break; #endregion //====================================================== case FrameType.ACK: #region ACK break; #endregion case FrameType.RET_MSG: #region RET_MSG Log.AppendText("Message error! No connection\n"); break; #endregion case FrameType.RET_FILE: #region RET_FILE Log.AppendText("File error! No connection\n"); break; #endregion } }
public void WriteData(string input, FrameType type) { byte[] Header = { STARTBYTE, (byte)type }; byte[] fileId = { 0 }; byte[] size; byte[] NumOfFrames; byte[] FrameNumber; byte[] BufferToSend; byte[] Telegram; string Telegram_s; string size_s; byte[] ByteToEncode; byte[] ByteEncoded; switch (type) { case FrameType.MSG: #region MSG if (IsConnected()) { // Telegram[] = Coding(input); Telegram = Encoding.Default.GetBytes(input); //потом это кыш BufferToSend = new byte[Header.Length + Telegram.Length]; //буфер для отправки = заголовок+сообщение Header.CopyTo(BufferToSend, 0); Telegram.CopyTo(BufferToSend, Header.Length); Port.Write(BufferToSend, 0, BufferToSend.Length); Log.AppendText("(" + Port.PortName + ") WriteData: sent message > " + Encoding.Default.GetString(Telegram) + "\n"); } break; #endregion case FrameType.ACK: WriteData(FilePath, Connection.FrameType.FILE); break; case FrameType.FILEOK: if (IsConnected()) { ByteToEncode = File.ReadAllBytes(@input); FilePath = input; size = new byte[sizeLenght]; size = Encoding.Default.GetBytes(((double)ByteToEncode.Length).ToString()); //нужны байты //Telegram = Encoding.Default.GetBytes(size); //потом это кыш BufferToSend = new byte[Header.Length + size.Length]; //буфер для отправки = заголовок+сообщение Header.CopyTo(BufferToSend, 0); size.CopyTo(BufferToSend, Header.Length); Port.Write(BufferToSend, 0, BufferToSend.Length); size_s = Encoding.Default.GetString(size); Log.AppendText("[" + DateTime.Now + "] Отправлена информация о размере файла: " + size_s + "\n"); //SuccessfulFrameNumber = int.Parse(Telegram_s); } break; case FrameType.FRAME: if (IsConnected()) { // Telegram[] = Coding(input); Telegram = Encoding.Default.GetBytes(input); //потом это кыш BufferToSend = new byte[Header.Length + Telegram.Length]; //буфер для отправки = заголовок+сообщение Header.CopyTo(BufferToSend, 0); Telegram.CopyTo(BufferToSend, Header.Length); Port.Write(BufferToSend, 0, BufferToSend.Length); Telegram_s = Encoding.Default.GetString(Telegram); Log.AppendText("[" + DateTime.Now + "] получен Frame > " + Telegram_s + " .Отправлено подтверждение о получении.\n"); //SuccessfulFrameNumber = int.Parse(Telegram_s); } break; case FrameType.FILE: #region FILE if (IsConnected()) { ByteToEncode = File.ReadAllBytes(@FilePath); size = new byte[sizeLenght]; size = Encoding.Default.GetBytes(((double)ByteToEncode.Length).ToString()); //нужны байты WriteData(Encoding.Default.GetString(size), FrameType.FILEOK); NumOfFrames = new byte[NumOfFrameLenght]; FrameNumber = new byte[NumOfFrameLenght]; string typeFile = @input.Split('.')[1]; fileId[0] = TypeFile_to_IdFile(typeFile); ByteEncoded = new byte[ByteToEncode.Length * 2]; for (int i = 0; i < ByteToEncode.Length; i++) { Hamming.HammingEncode74(ByteToEncode[i]).CopyTo(ByteEncoded, i * 2); } if (ByteEncoded.Length + InfoLen < Port.WriteBufferSize) { BufferToSend = new byte[InfoLen + ByteEncoded.Length]; Header.CopyTo(BufferToSend, 0); fileId.CopyTo(BufferToSend, Header.Length); size.CopyTo(BufferToSend, Header.Length + fileId.Length); NumOfFrames = Encoding.Default.GetBytes(1.ToString()); NumOfFrames.CopyTo(BufferToSend, Header.Length + fileId.Length + sizeLenght); FrameNumber = Encoding.Default.GetBytes(1.ToString()); FrameNumber.CopyTo(BufferToSend, Header.Length + fileId.Length + sizeLenght + NumOfFrameLenght); ByteEncoded.CopyTo(BufferToSend, InfoLen); bool flag = false; while (!flag) { if (MessageBox.Show("Отправить?", "Файл", MessageBoxButtons.YesNo) == DialogResult.Yes) { flag = true; Port.Write(BufferToSend, 0, BufferToSend.Length); //loading.Hide(); MessageBox.Show("Готово!"); //loading.progressBar1.Value = 0; //loading.i = 1; } else { flag = true; //loading.Hide(); //loading.progressBar1.Value = 0; MessageBox.Show("Вы отменили передачу файла."); // loading.i = 1; } } } else { int EncodedByteIndex; int Part_ByteEncodedIndex; int parts = (int)Math.Ceiling((double)ByteEncoded.Length / (double)(Port.WriteBufferSize - InfoLen)); NumOfFrames = Encoding.Default.GetBytes(parts.ToString()); for (int i = 0; i < parts; i++) { EncodedByteIndex = i * (Port.WriteBufferSize - InfoLen); Part_ByteEncodedIndex = (Port.WriteBufferSize - InfoLen); byte[] Part_ByteEncoded = new byte[Part_ByteEncodedIndex]; int Part_Len = 0; if (((ByteEncoded.Length - EncodedByteIndex) >= Part_ByteEncodedIndex)) { Part_Len = Part_ByteEncodedIndex; } else if (ByteEncoded.Length - EncodedByteIndex > 0) { Part_Len = ByteEncoded.Length - i * (Port.WriteBufferSize - InfoLen); } BufferToSend = new byte[Port.WriteBufferSize]; Header.CopyTo(BufferToSend, 0); fileId.CopyTo(BufferToSend, Header.Length); size.CopyTo(BufferToSend, Header.Length + fileId.Length); NumOfFrames.CopyTo(BufferToSend, Header.Length + fileId.Length + sizeLenght); FrameNumber = Encoding.Default.GetBytes((i + 1).ToString()); FrameNumber.CopyTo(BufferToSend, Header.Length + fileId.Length + sizeLenght + NumOfFrameLenght); Array.ConstrainedCopy(ByteEncoded, EncodedByteIndex, BufferToSend, InfoLen, Part_Len); Log.AppendText("[" + DateTime.Now + "] : Отправляется фрейм: " + (SuccessfulFrameNumber + 1).ToString() + "\n"); Port.Write(BufferToSend, 0, BufferToSend.Length); int ByteCheck; if (i > 0) { int WaitTime = 0; ByteCheck = Port.ReadByte(); while (ByteCheck != (int)STARTBYTE) { if (WaitTime <= 10000) { Thread.Sleep(100); WaitTime += 100; ByteCheck = Port.ReadByte(); } } ByteCheck = Port.ReadByte(); if (ByteCheck == (int)FrameType.FRAME) { int n = Port.BytesToRead; byte[] msgByteBuffer = new byte[n]; Port.Read(msgByteBuffer, 0, n); //считываем сообщение string Message = Encoding.Default.GetString(msgByteBuffer); Log.Invoke(new EventHandler(delegate { Log.AppendText("[" + DateTime.Now + "] : Получено подтверждение об успешной доставке Frame " + Message + "\n"); })); SuccessfulFrameNumber = int.Parse(Message); } if (i + 1 == SuccessfulFrameNumber) { continue; } if (i + 1 != SuccessfulFrameNumber) { MessageBox.Show("Передача файла прервана"); break; } } } } } break; #endregion default: if (IsConnected()) { Port.Write(Header, 0, Header.Length); } break; } //Зачем такая конструкция? Log.Invoke(new EventHandler(delegate { Log.AppendText("sent frame " + type + "\n"); //всё записываем, мы же снобы })); }
public void GetData(int typeId) { FrameType type = (FrameType)typeId; byte[] ToDecode; byte[] Decoded; /*Log.Invoke(new EventHandler(delegate * { * Log.AppendText("get frame " + type +"\n"); * }));*/ switch (type) { case FrameType.MSG: #region MSG if (IsConnected()) { int n = Port.BytesToRead; byte[] msgByteBuffer = new byte[n]; Port.Read(msgByteBuffer, 0, n); //считываем сообщение string Message = Encoding.Default.GetString(msgByteBuffer); Log.Invoke(new EventHandler(delegate { Log.AppendText("(" + Port.PortName + ") GetData: новое сообщение > " + Message + "\n"); })); WriteData(null, FrameType.ACK); } else { WriteData(null, FrameType.RET_MSG); } break; #endregion case FrameType.FILEOK: #region FILEOK if (IsConnected()) { int n = Port.BytesToRead; byte[] msgByteBuffer = new byte[n]; Port.Read(msgByteBuffer, 0, n); //считываем сообщение string Message = Encoding.Default.GetString(msgByteBuffer); Log.Invoke(new EventHandler(delegate { Log.AppendText("[" + DateTime.Now + "]: Получено предложение на прием файла размером: " + Message + " байт\n"); })); //SuccessfulFrameNumber = int.Parse(Message); int Message_num = int.Parse(Message); double fileSize = Math.Round((double)Message_num / 1024, 3); if (MessageBox.Show("Получено предложение на прием файла. Размер: " + fileSize.ToString() + " Кбайт.\nПринять?", "Прием файла", MessageBoxButtons.YesNo) == DialogResult.Yes) { WriteData("OK", FrameType.ACK); b_ChooseFile.Invoke(new EventHandler(delegate { b_ChooseFile.Enabled = false; })); b_OpenPort.Invoke(new EventHandler(delegate { b_OpenPort.Enabled = false; })); } } else { MessageBox.Show("Нет соединения!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } break; #endregion case FrameType.FILE: while ((!IsConnected()) && (BreakConnection)) { Port.DiscardInBuffer(); Log.Invoke(new EventHandler(delegate { Log.AppendText( "[" + DateTime.Now + "]: " + "Ожидание файла..." + "\r\n"); Log.ScrollToCaret(); Thread.Sleep(1000); })); } #region FILE if (IsConnected()) { byte fileId = (byte)Port.ReadByte(); string typeFile = TypeFileAnalysis(fileId); byte[] size = new byte[sizeLenght]; Port.Read(size, 0, sizeLenght); int ssize = (int)Double.Parse(Encoding.Default.GetString(size)); byte[] byte_NumOfFrames = new byte[NumOfFrameLenght]; Port.Read(byte_NumOfFrames, 0, NumOfFrameLenght); int NumOfFrames = (int)Double.Parse(Encoding.Default.GetString(byte_NumOfFrames)); ProgressBar.Invoke(new EventHandler(delegate { ProgressBar.Visible = true; ProgressBar.Maximum = NumOfFrames; })); byte[] byte_FrameNumber = new byte[NumOfFrameLenght]; Port.Read(byte_FrameNumber, 0, NumOfFrameLenght); int FrameNumber = (int)Double.Parse(Encoding.Default.GetString(byte_FrameNumber)); if (FrameNumber == 1) { file_buffer = new byte[NumOfFrames * (Port.WriteBufferSize - 27)]; } Log.Invoke(new EventHandler(delegate { Log.AppendText( "[" + DateTime.Now + "]: " + "Загружен кадр " + FrameNumber.ToString() + "\r\n"); Log.ScrollToCaret(); })); int n = Port.WriteBufferSize - InfoLen; byte[] newPart = new byte[n]; Port.Read(newPart, 0, n); newPart.CopyTo(file_buffer, n * (FrameNumber - 1)); if (ProgressBar.Value != FrameNumber) { ProgressBar.Invoke(new EventHandler(delegate { ProgressBar.Value++; })); } WriteData(FrameNumber.ToString(), FrameType.FRAME); if (FrameNumber == NumOfFrames) { Decoded = new byte[ssize]; ToDecode = new byte[2]; for (int i = 0; i < ssize; i++) { ToDecode[0] = file_buffer[i * 2]; ToDecode[1] = file_buffer[(i * 2) + 1]; Decoded[i] = Hamming.Decode(ToDecode); } Log.Invoke(new EventHandler(delegate { Log.AppendText( "[" + DateTime.Now + "]: " + "Файл успешно получен" + "\r\n"); Log.ScrollToCaret(); b_ChooseFile.Enabled = true; b_OpenPort.Enabled = true; })); SaveFileDialog saveFileDialog = new SaveFileDialog(); MainForm.Invoke(new EventHandler(delegate { saveFileDialog.FileName = ""; saveFileDialog.Filter = "TypeFile (*." + typeFile + ")|*." + typeFile + "|All files (*.*)|*.*"; if (DialogResult.OK == saveFileDialog.ShowDialog()) { File.WriteAllBytes(saveFileDialog.FileName, Decoded); //WriteData(null, FrameType.ACK); Log.Invoke(new EventHandler(delegate { Log.AppendText( "[" + DateTime.Now + "]: " + "Файл сохранен" + "\r\n"); Log.ScrollToCaret(); b_ChooseFile.Enabled = true; b_OpenPort.Enabled = true; })); } else { // MessageBox.Show("Отмена "); Log.Invoke(new EventHandler(delegate { Log.AppendText( "[" + DateTime.Now + "]: " + "Вы не сохранили файл" + "\r\n"); Log.ScrollToCaret(); })); } })); ProgressBar.Invoke(new EventHandler(delegate { ProgressBar.Value = 0; })); } } else { WriteData(null, FrameType.ERR_FILE); } break; #endregion //====================================================== case FrameType.ACK: #region ACK WriteData(FilePath, FrameType.FILE); break; #endregion case FrameType.RET_MSG: #region RET_MSG Log.AppendText("Ошибка отправки! Нет соединения\n"); break; #endregion case FrameType.ERR_FILE: #region RET_FILE Log.AppendText("Ошибка отправки файла! Нет соединения\n"); break; #endregion } }
public void WriteData(string input, FrameType type) { byte[] Header = { STARTBYTE, (byte)type }; byte[] fileId = { 0 }; byte[] size; byte[] NumOfFrames; byte[] FrameNumber; byte[] BufferToSend; byte[] Telegram; string Telegram_s; string size_s; byte[] ByteToEncode; byte[] ByteEncoded; switch (type) { case FrameType.ERR_FILE: break; case FrameType.MSG: #region MSG if (IsConnected()) { // Telegram[] = Coding(input); Telegram = Encoding.Default.GetBytes(input); //потом это кыш BufferToSend = new byte[Header.Length + Telegram.Length]; //буфер для отправки = заголовок+сообщение Header.CopyTo(BufferToSend, 0); Telegram.CopyTo(BufferToSend, Header.Length); Port.Write(BufferToSend, 0, BufferToSend.Length); Log.AppendText("(" + Port.PortName + ") WriteData: sent message > " + Encoding.Default.GetString(Telegram) + "\n"); } break; #endregion case FrameType.ACK: #region ACK if (IsConnected()) { // Telegram[] = Coding(input); Telegram = Encoding.Default.GetBytes(input); //потом это кыш BufferToSend = new byte[Header.Length + Telegram.Length]; //буфер для отправки = заголовок+сообщение Header.CopyTo(BufferToSend, 0); Telegram.CopyTo(BufferToSend, Header.Length); Port.Write(BufferToSend, 0, BufferToSend.Length); Telegram_s = Encoding.Default.GetString(Telegram); //Log.AppendText("[" + DateTime.Now + "] Отправлено ACK согласие на принятие файла: " + Telegram_s + "\n"); } break; #endregion case FrameType.FILEOK: #region FILEOK if (IsConnected()) { ByteToEncode = File.ReadAllBytes(input); FilePath = input; size = new byte[sizeLenght]; size = Encoding.Default.GetBytes(((double)ByteToEncode.Length).ToString()); //нужны байты //Telegram = Encoding.Default.GetBytes(size); //потом это кыш BufferToSend = new byte[Header.Length + size.Length]; //буфер для отправки = заголовок+сообщение Header.CopyTo(BufferToSend, 0); size.CopyTo(BufferToSend, Header.Length); Port.Write(BufferToSend, 0, BufferToSend.Length); size_s = Encoding.Default.GetString(size); Log.AppendText("[" + DateTime.Now + "] Отправлена информация о размере файла: " + size_s + " байт\n"); //SuccessfulFrameNumber = int.Parse(Telegram_s); } break; #endregion case FrameType.FRAME: #region FRAME if (IsConnected()) { // Telegram[] = Coding(input); Telegram = Encoding.Default.GetBytes(input); //потом это кыш BufferToSend = new byte[Header.Length + Telegram.Length]; //буфер для отправки = заголовок+сообщение Header.CopyTo(BufferToSend, 0); Telegram.CopyTo(BufferToSend, Header.Length); Port.Write(BufferToSend, 0, BufferToSend.Length); Telegram_s = Encoding.Default.GetString(Telegram); //Log.AppendText("[" + DateTime.Now + "] Получен кадр " + Telegram_s + " .Отправлено подтверждение о получении\n"); //SuccessfulFrameNumber = int.Parse(Telegram_s); } else { Log.Invoke(new EventHandler(delegate { Log.AppendText("[" + DateTime.Now + "]: Передача файла нарушена."); })); //MessageBox.Show("Соединение прервано. Передача нарушена.4"); BreakConnection = true; break; } break; #endregion case FrameType.FILE: #region FILE int i; int parts = 0; int EncodedByteIndex; int Part_ByteEncodedIndex; ByteEncoded = new byte[0]; size = new byte[0]; NumOfFrames = new byte[0]; if (IsConnected()) { ByteToEncode = File.ReadAllBytes(@FilePath); //b_ChooseFile.Invoke(new EventHandler(delegate //{ // b_ChooseFile.Enabled = false; //})); b_ChooseFile.Invoke(new EventHandler(delegate { b_ChooseFile.Enabled = false; })); b_OpenPort.Invoke(new EventHandler(delegate { b_OpenPort.Enabled = false; })); size = new byte[sizeLenght]; size = Encoding.Default.GetBytes(((double)ByteToEncode.Length).ToString()); //нужны байты //WriteData(Encoding.Default.GetString(size), FrameType.FILEOK); NumOfFrames = new byte[NumOfFrameLenght]; FrameNumber = new byte[NumOfFrameLenght]; string typeFile = @input.Split('.')[1]; fileId[0] = TypeFile_to_IdFile(typeFile); ByteEncoded = new byte[ByteToEncode.Length * 2]; for (i = 0; i < ByteToEncode.Length; i++) { Hamming.HammingEncode74(ByteToEncode[i]).CopyTo(ByteEncoded, i * 2); } if (ByteEncoded.Length + InfoLen < Port.WriteBufferSize) { BufferToSend = new byte[InfoLen + ByteEncoded.Length]; Header.CopyTo(BufferToSend, 0); fileId.CopyTo(BufferToSend, Header.Length); size.CopyTo(BufferToSend, Header.Length + fileId.Length); NumOfFrames = Encoding.Default.GetBytes(1.ToString()); NumOfFrames.CopyTo(BufferToSend, Header.Length + fileId.Length + sizeLenght); FrameNumber = Encoding.Default.GetBytes(1.ToString()); FrameNumber.CopyTo(BufferToSend, Header.Length + fileId.Length + sizeLenght + NumOfFrameLenght); ByteEncoded.CopyTo(BufferToSend, InfoLen); bool flag = false; while (!flag) { if (MessageBox.Show("Отправить?", "Файл", MessageBoxButtons.YesNo) == DialogResult.Yes) { flag = true; Port.Write(BufferToSend, 0, BufferToSend.Length); //loading.Hide(); MessageBox.Show("Готово!"); //loading.progressBar1.Value = 0; //loading.i = 1; } else { flag = true; //loading.Hide(); //loading.progressBar1.Value = 0; MessageBox.Show("Вы отменили передачу файла."); // loading.i = 1; } } } else { //EncodedByteIndex; //Part_ByteEncodedIndex; parts = (int)Math.Ceiling((double)ByteEncoded.Length / (double)(Port.WriteBufferSize - InfoLen)); ProgressBar.Invoke(new EventHandler(delegate { ProgressBar.Visible = true; ProgressBar.Maximum = parts; })); NumOfFrames = Encoding.Default.GetBytes(parts.ToString()); for (i = 0; i < parts; i++) { EncodedByteIndex = i * (Port.WriteBufferSize - InfoLen); Part_ByteEncodedIndex = (Port.WriteBufferSize - InfoLen); byte[] Part_ByteEncoded = new byte[Part_ByteEncodedIndex]; int Part_Len = 0; if (((ByteEncoded.Length - EncodedByteIndex) >= Part_ByteEncodedIndex)) { Part_Len = Part_ByteEncodedIndex; } else if (ByteEncoded.Length - EncodedByteIndex > 0) { Part_Len = ByteEncoded.Length - i * (Port.WriteBufferSize - InfoLen); } BufferToSend = new byte[Port.WriteBufferSize]; Header.CopyTo(BufferToSend, 0); fileId.CopyTo(BufferToSend, Header.Length); size.CopyTo(BufferToSend, Header.Length + fileId.Length); NumOfFrames.CopyTo(BufferToSend, Header.Length + fileId.Length + sizeLenght); FrameNumber = Encoding.Default.GetBytes((i + 1).ToString()); FrameNumber.CopyTo(BufferToSend, Header.Length + fileId.Length + sizeLenght + NumOfFrameLenght); Array.ConstrainedCopy(ByteEncoded, EncodedByteIndex, BufferToSend, InfoLen, Part_Len); //Log.AppendText("[" + DateTime.Now + "]: Отправляется фрейм: " + (SuccessfulFrameNumber + 1).ToString() + "\n"); if (IsConnected()) { Port.Write(BufferToSend, 0, BufferToSend.Length); } Log.Invoke(new EventHandler(delegate { Log.AppendText("[" + DateTime.Now + "]: Отправка кадра " + (i + 1).ToString() + "\n"); Log.ScrollToCaret(); })); if (ProgressBar.Value != parts) { ProgressBar.Invoke(new EventHandler(delegate { ProgressBar.Value++; })); } byte[] ByteCheck = new byte[1]; if (i > 0 && IsConnected()) { //Thread.Sleep(10); int WaitTime = 0; try { Port.Read(ByteCheck, 0, 1); } catch (Exception e) { Log.AppendText(e.Message); break; } while (ByteCheck[0] != STARTBYTE) { if (WaitTime <= 100) { Thread.Sleep(10); WaitTime += 10; Port.Read(ByteCheck, 0, 1); } else { MessageBox.Show("Передача файла прервана"); break; } } if (IsConnected()) { continue; } Port.Read(ByteCheck, 0, 1); if (ByteCheck[0] == (int)FrameType.FRAME) { int n = FrameNumber.Length;//Port.BytesToRead; byte[] msgByteBuffer = new byte[n]; Port.Read(msgByteBuffer, 0, n); //считываем сообщение string Message = Encoding.Default.GetString(msgByteBuffer); //Log.Invoke(new EventHandler(delegate //{ // Log.AppendText("[" + DateTime.Now + "] Получено подтверждение об успешной доставке кадра " + Message + "\n"); //})); SuccessfulFrameNumber = int.Parse(Message); } if (i == SuccessfulFrameNumber) { continue; } //if (i != SuccessfulFrameNumber) //{ // MessageBox.Show("Передача файла нарушена.1"); // break; //} } if (!IsConnected()) { Log.Invoke(new EventHandler(delegate { Log.AppendText("[" + DateTime.Now + "]: Передача файла нарушена\n"); })); DialogResult result; while (!IsConnected()) { result = MessageBox.Show("Соединение прервано. Передача нарушена.\n" + "Восстановите соединение и нажмите ОК для докачки файла.\n" + "Иначе нажмите ОТМЕНА.", "Ошибка", MessageBoxButtons.OKCancel, MessageBoxIcon.Error); if (result == DialogResult.Cancel) { Log.Invoke(new EventHandler(delegate { Log.AppendText("[" + DateTime.Now + "]: Передача файла отменена\n"); })); ProgressBar.Invoke(new EventHandler(delegate { ProgressBar.Value = 0; })); return; } } //BreakConnection = true; i = SuccessfulFrameNumber - 1; //break; } } Log.Invoke(new EventHandler(delegate { Log.AppendText("[" + DateTime.Now + "]: Файл успешно передан\n"); })); ProgressBar.Invoke(new EventHandler(delegate { ProgressBar.Value = 0; })); b_ChooseFile.Invoke(new EventHandler(delegate { b_ChooseFile.Enabled = true; })); b_OpenPort.Invoke(new EventHandler(delegate { b_OpenPort.Enabled = true; })); } } else { Log.Invoke(new EventHandler(delegate { Log.AppendText("[" + DateTime.Now + "]: Передача файла нарушена.\n" + "Последний успешный фрейм: " + SuccessfulFrameNumber.ToString()); })); //MessageBox.Show("Соединение прервано. Передача нарушена.3"); BreakConnection = true; break; } break; #endregion default: if (IsConnected()) { Port.Write(Header, 0, Header.Length); } break; } //Зачем такая конструкция? //Log.Invoke(new EventHandler(delegate //{ // Log.AppendText("sent frame " + type + "\n"); //всё записываем, мы же снобы //})); }
public void GetData(int typeId) { FrameType type = (FrameType)typeId; //FrameType frametype = (FrameType)Enum.ToObject(typeof(FrameType), frametypeid); int bytesToRead = Port.WriteBufferSize; byte[] byteBuffer; int i; int FileByteSize = 1; byte[] ToDecode; byte[] Decoded = new byte[bytesToRead / 2]; byte[] DecodedFull = new byte[FileByteSize]; string typeFile = "0"; //int parts; //string parts_s; //WriteLog(DirectionType.INCOMING, frametype); Log.Invoke(new EventHandler(delegate { Log.AppendText("get frame " + type + "\n"); })); switch (type) { case FrameType.MSG: #region MSG if (IsConnected()) { int n = Port.BytesToRead; byte[] msgByteBuffer = new byte[n]; Port.Read(msgByteBuffer, 0, n); //считываем сообщение string Message = Encoding.Default.GetString(msgByteBuffer); Log.Invoke(new EventHandler(delegate { Log.AppendText("(" + Port.PortName + ") GetData: new message > " + Message + "\n"); })); WriteData(null, FrameType.ACK); } else { WriteData(null, FrameType.RET_MSG); } break; #endregion case FrameType.FILE: #region FILE if (IsConnected()) { //byte[] byteBuffer; //byte[] size = new byte[10]; //Port.Read(size, 0, 10); //string size_s = Encoding.Default.GetString(size); //double ssize = Double.Parse(size_s); //размер файла //нужен ли он вообще /наверное, нужен //int n = Port.BytesToRead; //byteBuffer = new byte[n]; //Port.Read(byteBuffer, 0, n); //Log.Invoke(new EventHandler(delegate //{ // Log.AppendText("(" + Port.PortName + ") : GetData: new file > " + byteBuffer.Length + " bytes\n"); //})); //WriteData(null, FrameType.ACK); //Port.ReadByte(); byte fileId = (byte)Port.ReadByte(); typeFile = TypeFileAnalysis(fileId); byte[] size; //byte[] NumOfFrames; string size_s; size = new byte[10]; Port.Read(size, 0, 10); size_s = Encoding.Unicode.GetString(size); //NumOfFrames = new byte[10]; //for (i = 0; i < NumOfFrames.Length; i++) //{ // NumOfFrames[i] = 0; //} //Port.Read(NumOfFrames, 0, 10); //parts_s = Encoding.Unicode.GetString(NumOfFrames); //parts = int.Parse(parts_s); //MessageBox.Show(spd_s) //double ssize; //ssize = double.Parse(size_s); DialogResult result; result = MessageBox.Show("Файл. Размер: " + size_s + " Кбайт.\nПринять?", "Прием файла", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) { FileByteSize = (int)Math.Ceiling(double.Parse(size_s)) * 1024; byte[] EncodedFile = new byte[FileByteSize * 2]; DecodedFull = new byte[FileByteSize]; int k = 0; while (IsConnected() & bytesToRead * k < DecodedFull.Length) { byteBuffer = new byte[bytesToRead]; Port.Read(byteBuffer, 0, bytesToRead); byteBuffer.CopyTo(EncodedFile, byteBuffer.Length * k); Decoded = new byte[EncodedFile.Length / 2]; ToDecode = new byte[2]; ; for (i = 0; i < EncodedFile.Length / 2; i++) { ToDecode[0] = EncodedFile[i * 2]; ToDecode[1] = EncodedFile[(i * 2) + 1]; Decoded[i] = Hamming.Decode(ToDecode); } //bytesToRead = Port.BytesToRead; //byteBuffer = new byte[bytesToRead]; //Port.Read(byteBuffer, 0, bytesToRead); //Decoded = new byte[bytesToRead / 2]; //ToDecode = new byte[2]; //; //for (i = 0; i < bytesToRead / 2; i++) //{ // ToDecode[0] = byteBuffer[i * 2]; // ToDecode[1] = byteBuffer[(i * 2) + 1]; // Decoded[i] = Hamming.Decode(ToDecode); //} //Decoded.CopyTo(DecodedFull, Decoded.Length*k); k++; } SaveFileDialog saveFileDialog = new SaveFileDialog(); MainForm.Invoke(new EventHandler(delegate { saveFileDialog.FileName = ""; saveFileDialog.Filter = "TypeFile (*." + typeFile + ")|*." + typeFile + "|All files (*.*)|*.*"; if (DialogResult.OK == saveFileDialog.ShowDialog()) { File.WriteAllBytes(saveFileDialog.FileName, Decoded); WriteData(null, FrameType.ACK); Display.Invoke(new EventHandler(delegate { Display.AppendText( "[" + DateTime.Now + "] : " + "Файл успешно получен" + "\r\n"); Display.ScrollToCaret(); })); } else { // MessageBox.Show("Отмена "); Display.Invoke(new EventHandler(delegate { Display.AppendText( "[" + DateTime.Now + "] : " + ": " + "Вы не сохранили файл" + "\r\n"); Display.ScrollToCaret(); })); } })); } else { // MessageBox.Show("Отмена "); Display.Invoke(new EventHandler(delegate { Display.AppendText( "[" + DateTime.Now + "] : " + ": " + "Вы не сохранили файл" + "\r\n"); Display.ScrollToCaret(); })); } } else { WriteData(null, FrameType.RET_FILE); } break; #endregion //====================================================== case FrameType.END: #region END if (IsConnected()) { SaveFileDialog saveFileDialog = new SaveFileDialog(); MainForm.Invoke(new EventHandler(delegate { saveFileDialog.FileName = ""; saveFileDialog.Filter = "TypeFile (*." + typeFile + ")|*." + typeFile + "|All files (*.*)|*.*"; if (DialogResult.OK == saveFileDialog.ShowDialog()) { File.WriteAllBytes(saveFileDialog.FileName, DecodedFull); //! WriteData(null, FrameType.ACK); Display.Invoke(new EventHandler(delegate { Display.AppendText( "[" + DateTime.Now + "] : " + "Файл успешно получен" + "\r\n"); Display.ScrollToCaret(); })); } else { // MessageBox.Show("Отмена "); Display.Invoke(new EventHandler(delegate { Display.AppendText( "[" + DateTime.Now + "] : " + ": " + "Вы не сохранили файл" + "\r\n"); Display.ScrollToCaret(); })); } })); } else { WriteData(null, FrameType.RET_FILE); } break; #endregion case FrameType.ACK: #region ACK break; #endregion case FrameType.RET_MSG: #region RET_MSG Log.AppendText("Message error! No connection\n"); break; #endregion case FrameType.RET_FILE: #region RET_FILE Log.AppendText("File error! No connection\n"); break; #endregion } }
public void WriteData(string input, FrameType type) //пока считаем, что input строка символов { byte[] Header = { STARTBYTE, (byte)type }; byte[] BufferToSend; byte[] Telegram; //Я добавил: //byte[] Header = { STARTBYTE, receiver, (byte)type, sender }; //byte[] BufferToSend; byte[] spd; byte[] size; byte[] ByteToEncode; byte[] ByteEncoded; byte[] NumOfFrames; byte[] fileId = { 0 }; int i; string result_s; switch (type) { case FrameType.MSG: #region MSG if (IsConnected()) { // Telegram[] = Coding(input); Telegram = Encoding.Default.GetBytes(input); //потом это кыш BufferToSend = new byte[Header.Length + Telegram.Length]; //буфер для отправки = заголовок+сообщение Header.CopyTo(BufferToSend, 0); Telegram.CopyTo(BufferToSend, Header.Length); Port.Write(BufferToSend, 0, BufferToSend.Length); Log.AppendText("(" + Port.PortName + ") WriteData: sent message > " + Encoding.Default.GetString(Telegram) + "\n"); } break; #endregion case FrameType.END: if (IsConnected()) { // Telegram[] = Coding(input); Telegram = Encoding.Default.GetBytes(input); //потом это кыш BufferToSend = new byte[Header.Length + Telegram.Length]; //буфер для отправки = заголовок+сообщение Header.CopyTo(BufferToSend, 0); Telegram.CopyTo(BufferToSend, Header.Length); Port.Write(BufferToSend, 0, BufferToSend.Length); Log.AppendText("(" + Port.PortName + ") WriteData: sent message > " + Encoding.Default.GetString(Telegram) + "\n"); } break; case FrameType.FILE: #region FILE if (IsConnected()) { ByteToEncode = File.ReadAllBytes(@input); size = new byte[10]; //MessageBox.Show(((double)ByteToEncode.Length / 1048576).ToString()); size = Encoding.Unicode.GetBytes(((double)ByteToEncode.Length / 1024).ToString()); //1048576 байт = 1 Мбайт //size = Encoding.Default.GetBytes((input.Length).ToString()); ByteEncoded = new byte[ByteToEncode.Length * 2]; i = 0; string typeFile = @input.Split('.')[1]; fileId[0] = TypeFile_to_IdFile(typeFile); Display.AppendText("Длина ByteToEncode:" + ByteToEncode.Length + "\n"); foreach (byte item in ByteToEncode) { Hamming.HammingEncode74(ByteToEncode[i]).CopyTo(ByteEncoded, i * 2); i++; //Display.AppendText(i / ByteToEncode.Length * 100 + ", "); //loading.progressBar1.Increment(i / ByteToEncode.Length * 100); } byte[] ToDecode = new byte[2]; byte[] Decoded = new byte[ByteEncoded.Length / 2]; for (int m = 0; m < ByteEncoded.Length / 2; m++) { ToDecode[0] = ByteEncoded[m * 2]; ToDecode[1] = ByteEncoded[(m * 2) + 1]; Decoded[m] = Hamming.Decode(ToDecode); } result_s = Encoding.UTF8.GetString(Decoded); // Сюда для проверки сохраняется раскодированный файл //double parts; //byte[] ToDecode; //byte[] Decoded; //byte[] byteBuffer; //Decoded = new byte[ByteEncoded.Length / 2]; //ToDecode = new byte[2]; //byteBuffer = new byte[ByteEncoded.Length]; //for (int m = 0; m < ByteEncoded.Length / 2; m++) //{ // ToDecode[0] = ByteEncoded[m * 2]; // ToDecode[1] = ByteEncoded[(m * 2) + 1]; // Decoded[m] = Hamming.Decode(ToDecode); //} //string Decoded_decoded = Encoding.UTF8.GetString(Decoded); //parts = (int)Math.Ceiling((double)ByteEncoded.Length / (double)(Port.WriteBufferSize - Header.Length - fileId.Length - 10)); //NumOfFrames = Encoding.Unicode.GetBytes((parts).ToString()); if (Header.Length + fileId.Length + ByteEncoded.Length + 8 < Port.WriteBufferSize) { BufferToSend = new byte[Header.Length + fileId.Length + 10 + ByteEncoded.Length]; //! Header.CopyTo(BufferToSend, 0); fileId.CopyTo(BufferToSend, Header.Length); size.CopyTo(BufferToSend, Header.Length + fileId.Length); //NumOfFrames.CopyTo(BufferToSend, Header.Length + fileId.Length + size.Length); ByteEncoded.CopyTo(BufferToSend, Header.Length + fileId.Length + 10 /*+ NumOfFrames.Length*/); //! bool flag = false; while (!flag) { //Application.DoEvents(); if (MessageBox.Show("Send?", "Test", MessageBoxButtons.YesNo) == DialogResult.Yes) { flag = true; Port.Write(BufferToSend, 0, BufferToSend.Length); //loading.Hide(); MessageBox.Show("Готово!"); //loading.progressBar1.Value = 0; //loading.i = 1; } else { flag = true; //loading.Hide(); //loading.progressBar1.Value = 0; MessageBox.Show("Вы отменили передачу файла."); // loading.i = 1; } } } else { double parts; int EncodedByteIndex; int Part_ByteEncodedIndex; parts = (double)ByteEncoded.Length / (double)(Port.WriteBufferSize /*- Header.Length - fileId.Length - 10*/); MessageBox.Show(Port.WriteBufferSize.ToString() + " " + parts.ToString() + "\n" + ((int)Math.Ceiling(parts)).ToString()); for (i = 0; i <= (int)Math.Ceiling(parts); i++) { BufferToSend = new byte[Port.WriteBufferSize]; //! Header.CopyTo(BufferToSend, 0); fileId.CopyTo(BufferToSend, Header.Length); size.CopyTo(BufferToSend, Header.Length + fileId.Length); byte[] Part_ByteEncoded; byte[] Last_Part; Part_ByteEncoded = new byte[Port.WriteBufferSize - Header.Length - fileId.Length - 10]; EncodedByteIndex = i * (Port.WriteBufferSize - Header.Length - fileId.Length - 10); Part_ByteEncodedIndex = (Port.WriteBufferSize - Header.Length - fileId.Length - 10); if (((ByteEncoded.Length - EncodedByteIndex) >= Part_ByteEncodedIndex)) { Array.ConstrainedCopy(ByteEncoded, EncodedByteIndex, Part_ByteEncoded, 0, Part_ByteEncodedIndex); ToDecode = new byte[2]; Decoded = new byte[Part_ByteEncoded.Length / 2]; for (int m = 0; m < Part_ByteEncoded.Length / 2; m++) { ToDecode[0] = Part_ByteEncoded[m * 2]; ToDecode[1] = Part_ByteEncoded[(m * 2) + 1]; Decoded[m] = Hamming.Decode(ToDecode); } result_s = Encoding.UTF8.GetString(Decoded); // Сюда для проверки сохраняется раскодированная посылаемая часть файла Part_ByteEncoded.CopyTo(BufferToSend, Header.Length + fileId.Length + 10); //! } else if (ByteEncoded.Length - EncodedByteIndex > 0) { Last_Part = new byte [ByteEncoded.Length - i * Port.WriteBufferSize]; Array.ConstrainedCopy(ByteEncoded, EncodedByteIndex, Last_Part, 0, ByteEncoded.Length - i * Port.WriteBufferSize); Last_Part.CopyTo(BufferToSend, Header.Length + fileId.Length + 10); //! Port.Write(BufferToSend, 0, BufferToSend.Length); break; } Port.Write(BufferToSend, 0, BufferToSend.Length); } } //WriteData("EOF", FrameType.END); } break; #endregion default: if (IsConnected()) { Port.Write(Header, 0, Header.Length); } break; } //Зачем такая конструкция? Log.Invoke(new EventHandler(delegate { Log.AppendText("sent frame " + type + "\n"); //всё записываем, мы же снобы })); }