Описание программы (1061424)
Текст из файла
Московский государственный технический университет имени Н. Э. Баумана.Факультет “Информатика и системы управления”.Кафедра “Системы обработки информации и управления”.Утверждаю:Галкин В.А."__"_____________2011г.Курсовая работапо курсуСетевые технологии«Программа пересылки файлов»Описание программы(вид документа)бумага А4(вид носителя)15(количество листов)Вариант 6.ИСПОЛНИТЕЛИ:студенты группы ИУ5-72Голиков С.В._____________________Николаев С.К._____________________Чаплыгина А.А_____________________"__"_____________2011 г.Москва 2011Оглавление1.
Введение ..................................................................................................................................... 32. Класс mainwindow:window .......................................................................................................
32.1. ПЕРЕМЕННЫЕ........................................................................................................................ 32.2. СОБЫТИЯ .............................................................................................................................. 32.3. МЕТОДЫ ...............................................................................................................................
43. Листинг....................................................................................................................................... 521. ВведениеПрограммный продукт написан с использованием технологии Windows PresentationFoundation на языке программирования C#.Для создания графического интерфейса и взаимодействия с COM-портомиспользовались стандартные библиотеки и элементы управления. Дополнительныефункции, не относящиеся к стандартным, приведены ниже.2. Класс MainWindow:Window- класс определяющий главного окна.2.1. ПеременныеSynchronizationContext UIContext –контекст синхронизации для обращения из одногопотока к элементам другого;bool Conn – состояние соединения;SerialPort ComPort – объект, описывающий COM-порт;Thread RThread – объект, описывающий параллельный поток чтения данных избуфера COM-порта;Thread CThread – объект, описывающий параллельный поток проверки соединения;FileStream SFileStream – файловый поток для чтения;FileStream PFileStream – файловый поток для записи;string SourcePath – путь на передающей ЭВМ к передаваемому файлу;string PurposePath – путь на принимающей ЭВМ для сохранения принимаемого файла;long p – последняя записываемая позиция чтения из файлового потока;bool ZagR – принят заголовок файла;bool InfR – принят файл;bool ZagS – заголовок файла доставлен;bool InfS – файл доставлен;bool Podtv – необходимость подтверждения отправки;int ChisloPovtorov – счетчик подряд идущих ошибок передач.2.2.
Событияprivate void Window_Loaded(object sender, RoutedEventArgs e) –событие, возникающее призагрузке окна:o object sender – объект, вызывающий событие;o RoutedEventArgs e – аргументы для события;private void Window_Closed(object sender, EventArgs e) – событие,возникающее при закрытииокна:ooobject sender – объект, вызывающий событие;RoutedEventArgs e – аргументы для события;private void button1_Click(object sender, RoutedEventArgs e) – событие,возникающее принажатии кнопки «Отправить файл»:3object sender – объект, вызывающий событие;o RoutedEventArgs e – аргументы для события;private void MenuItemClose_Click(object sender, RoutedEventArgs e) –oсобытие, возникающее принажатии на кнопку «Закрыть» в меню «Действия»:o object sender – объект, вызывающий событие;o RoutedEventArgs e – аргументы для события;private void MenuItemHelpA_Click(object sender, RoutedEventArgs e) –событие, возникающее принажатии на кнопку «О программе» в меню «Справка»:o object sender – объект, вызывающий событие;o RoutedEventArgs e – аргументы для события;private void MenuItemHelpD_Click(object sender, RoutedEventArgs e) событие, возникающее принажатии на кнопку «Разработка» в меню «Справка»:o object sender – объект, вызывающий событие;o RoutedEventArgs e – аргументы для события.2.3.
Методыpublic void Connect() – функция, проверки соединения;public void Read() – функция, чтения информации из COM-порта;void ACK() – функция, отправки положительной квитанции;void NAK() – функция, отправки отрицательной квитанции;void YES() – функция, отправки согласия на прием файла;void NO() – функция, отправки сообщения о несогласии на прием файла;void EOT() – функция, отправки сообщения о завершении передачи;bool? Sohranenie(string Zagolovok) – функция открытия диалога сохранения файла:o string Zagolovok – заголовок принимаемого файла;byte[] Upakovat(char Type) – функция для формирования неинформационного кадра:o char Type – тип кадра;byte[] Upakovat(byte[] InfByte, char Type, long Length) – функция для формированияинформационного кадра:o byte[] InfByte – массив информационных байтов;o char Type – тип кадра;o long Length – длина информационного поля кадра;byte[] Kodir(byte[] Ish, int k, string PorPolinom) – функция кодирования:o byte[] Ish – массив байтов для кодирования;o int k – число кодируемых битов;o string PorPolinom – порождающий полином;string VichOstatka(string Delimoe, string PorPolinom) – функция вычисление остатка последеления по модулю 2 двоичного числа на порождающий полином:o string Delimoe – делимое;o string PorPolinom – порождающий полином;byte[] Dekodir(string Ish, int k, string PorPolinom) – функция декодирования:o string Ish – декодируемая строка;o int k – число кодируемых битов;o string PorPolinom – порождающий полином;bool Proverka(string Ish, int k, string PorPolinom) – функция проверки закодированного кадрана наличие ошибок:o string Ish – декодируемая строкаo int k – число кодируемых битов;o string PorPolinom – порождающий полином;43.
Листингusing System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;using System.IO;using System.IO.Ports;using System.Threading;using Microsoft.Win32;namespace Kurs_NetworkTechnology{/// <summary>/// Логика взаимодействия для MainWindow.xaml/// </summary>public partial class MainWindow : Window{SynchronizationContext UIContext;bool Conn = false;SerialPort ComPort;Thread RThread;Thread CThread;FileStream SFileStream;FileStream PFileStream;string SourcePath;string PurposePath;long p;//последняя записываемая позицияbool ZagR = false;//получен заголовокbool InfR = false;//получение информационной частиbool ZagS = false;//отправлен заголовокbool InfS = false;//отправка иноформационной частиbool Podtv = false;//необходимо подтверждениеint ChisloPovtorov = 0;public MainWindow(){InitializeComponent();}private void Window_Loaded(object sender, RoutedEventArgs e){button1.IsEnabled = false;UIContext = SynchronizationContext.Current;RThread = new Thread(Read);CThread = new Thread(Connect);ComPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);ComPort.Handshake = Handshake.None;ComPort.DtrEnable = true;ComPort.RtsEnable = false;ComPort.ReadTimeout = 500;ComPort.WriteTimeout = 500;ComPort.Open();CThread.Start();RThread.Start();}private void Window_Closed(object sender, EventArgs e){5Conn = false;RThread.Abort();CThread.Abort();ComPort.Close();}private void button1_Click(object sender, RoutedEventArgs e){OpenFileDialog sourceBrowse = new OpenFileDialog();sourceBrowse.Multiselect = false;sourceBrowse.Title = "Выберите передаваемый файл";bool? BrowseOp = sourceBrowse.ShowDialog();string FileName;if (BrowseOp == true){SourcePath = sourceBrowse.FileName;SFileStream = new FileStream(SourcePath, FileMode.Open,FileAccess.Read);progressBar1.Maximum = (SFileStream.Length / 50)+1;progressBar1.Value = 0;FileName = SourcePath.Substring(SourcePath.LastIndexOf('\\') + 1);byte[] Zagolovok = new byte[FileName.Count()];for (int i = 0; i < FileName.Count(); i++){Zagolovok[i] = Convert.ToByte(FileName[i]);}byte[] telegram = Kodir(Upakovat(Zagolovok, 'I',Zagolovok.Count()), 4, "1011");ComPort.RtsEnable = false;Podtv = true;ComPort.Write(telegram, 0, telegram.Count());Thread.Sleep(100);ComPort.RtsEnable = true;}}public void Connect(){while (true){if ((ComPort.DsrHolding{Conn = true;UIContext.Send(d =>UIContext.Send(d =>UIContext.Send(d =>}if ((ComPort.DsrHolding== true)&(ZagR==false)&(ZagS==false))label2.Content = "Активно", null);MenuItem_Send.IsEnabled = true, null);button1.IsEnabled = true, null);== false) & (ZagR == false) & (ZagS ==false)){Conn = false;UIContext.Send(d=>label2.Content = "Отсутствует",null);UIContext.Send(d => MenuItem_Send.IsEnabled = false, null);UIContext.Send(d => button1.IsEnabled = false, null);}if (((ZagR == true) || (ZagS == true)) & (Conn == false)){UIContext.Send(d => progressBar1.Visibility =Visibility.Hidden, null);UIContext.Send(d => label4.Visibility = Visibility.Hidden,null);UIContext.Send(d => MenuItem_Action.IsEnabled = true, null);UIContext.Send(d => button1.IsEnabled = true, null);MessageBox.Show("Во время передачи возникла ошибка!\nПередачапрервана!");ZagR = false;InfR = false;6ZagS = false;InfS = false;PFileStream.Close();PFileStream.Dispose();SFileStream.Close();SFileStream.Dispose();}Thread.Sleep(1000);}}public void Read(){while (true){while ((Conn == true) & (ComPort.CtsHolding == true)){string mess = "";string message = "";string s1 = "";for (int i = 0; ComPort.BytesToRead > 0; i++){s1 = Convert.ToString(ComPort.ReadByte(), 2);if (s1.Count() < 8){for (int j = 0; s1.Count() < 8; j++){s1 = "0" + s1;}}message += s1;Thread.Sleep(30);}if (message.Count() > 0){if (Proverka(message, 4, "1011") == true){ChisloPovtorov++;if (ChisloPovtorov >= 5){UIContext.Send(d => label4.Visibility =Visibility.Hidden, null);UIContext.Send(d => MenuItem_Action.IsEnabled =true, null);UIContext.Send(d => button1.IsEnabled = true,null);MessageBox.Show("Во время передачи возниклиошибки!\nПередача прервана!");ZagR = false;InfR = false;ZagS = false;InfS = false;PFileStream.Close();PFileStream.Dispose();ChisloPovtorov = 0;}NAK();}else{byte[] DekMes = Dekodir(message, 4, "1011");if (DekMes[1] == Convert.ToByte('A')){ChisloPovtorov = 0;ComPort.RtsEnable = false;if ((ZagS == true) & (InfS == true) & (Podtv ==false))7{ZagR = false;InfR = false;ZagS = false;InfS = false;UIContext.Send(d => progressBar1.Visibility =Visibility.Hidden, null);UIContext.Send(d => button1.IsEnabled = true,null);UIContext.Send(d => MenuItem_Action.IsEnabled= true, null);MessageBox.Show("Файл передан!");SFileStream.Close();SFileStream.Dispose();}if ((ZagS == true) & (InfS == false) & (Podtv ==true)){UIContext.Send(d => progressBar1.Value++,null);p = SFileStream.Position;long k = SFileStream.Length - p;if (k > 0){byte[] inf;if (k > 50){inf = new byte[50];for (int i = 0; i < 50; i++){inf[i] =Convert.ToByte(SFileStream.ReadByte());}}else{inf = new byte[k];for (int i = 0; i < k; i++){inf[i] =Convert.ToByte(SFileStream.ReadByte());}}byte[] telegram = Kodir(Upakovat(inf, 'I',inf.Count()), 4, "1011");ComPort.RtsEnable = false;Podtv = true;ComPort.Write(telegram, 0,telegram.Count());Thread.Sleep(100);ComPort.RtsEnable = true;}else{InfS = true;Podtv = false;EOT();}}if ((ZagS == false) & (Podtv == true)){ZagS = true;}}if (DekMes[1] == Convert.ToByte('R')){ChisloPovtorov++;8if (ChisloPovtorov >= 5){UIContext.Send(d => progressBar1.Visibility =Visibility.Hidden, null);UIContext.Send(d => MenuItem_Action.IsEnabled= true, null);UIContext.Send(d => button1.IsEnabled = true,null);MessageBox.Show("Во время передачи возниклаошибка!\nПередача прервана!");ZagR = false;InfR = false;ZagS = false;InfS = false;ChisloPovtorov = 0;SFileStream.Close();SFileStream.Dispose();}else{if (ZagS == true){byte[] inf;long k = SFileStream.Length - p;SFileStream.Position = p;if (k > 50){inf = new byte[50];for (int i = 0; i < 50; i++){inf[i] =Convert.ToByte(SFileStream.ReadByte());}}else{inf = new byte[k];for (int i = 0; i < k; i++){inf[i] =Convert.ToByte(SFileStream.ReadByte());}}byte[] telegram = Kodir(Upakovat(inf, 'I',inf.Count()), 4, "1011");ComPort.RtsEnable = false;Podtv = true;ComPort.Write(telegram, 0,telegram.Count());Thread.Sleep(100);ComPort.RtsEnable = true;}else{string FileName =SourcePath.Substring(SourcePath.LastIndexOf('\\') + 1);byte[] Zagolovok = newbyte[FileName.Count()];for (int i = 0; i < FileName.Count(); i++){Zagolovok[i] =Convert.ToByte(FileName[i]);}byte[] telegram =Kodir(Upakovat(Zagolovok, 'I', Zagolovok.Count()), 4, "1011");ComPort.RtsEnable = false;Podtv = true;9ComPort.Write(telegram, 0,telegram.Count());Thread.Sleep(100);ComPort.RtsEnable = true;}}}if (DekMes[1] == Convert.ToByte('Y')){UIContext.Send(d => button1.IsEnabled = false,null);UIContext.Send(d => MenuItem_Action.IsEnabled =false, null);UIContext.Send(d => progressBar1.Visibility =Visibility.Visible, null);byte[] inf;p = SFileStream.Position;long k = SFileStream.Length - p;if (k > 50){inf = new byte[50];for (int i = 0; i < 50; i++){inf[i] =Convert.ToByte(SFileStream.ReadByte());}}else{inf = new byte[k];for (int i = 0; i < k; i++){inf[i] =Convert.ToByte(SFileStream.ReadByte());}}Podtv = false;byte[] telegram = Kodir(Upakovat(inf, 'I',inf.Count()), 4, "1011");ComPort.RtsEnable = false;Podtv = true;ComPort.Write(telegram, 0, telegram.Count());Thread.Sleep(100);ComPort.RtsEnable = true;}if (DekMes[1] == Convert.ToByte('N')){MessageBox.Show("Принимающая сторона отказываетсяпринимать файл!");SFileStream.Close();SFileStream.Dispose();ZagR = false;InfR = false;ZagS = false;InfS = false;}if (DekMes[1] == Convert.ToByte('E')){InfR = true;UIContext.Send(d => label4.Visibility =Visibility.Hidden, null);UIContext.Send(d => MenuItem_Action.IsEnabled =true, null);UIContext.Send(d => button1.IsEnabled = true,null);MessageBox.Show("Файл принят!");ACK();10ZagR = false;InfR = false;ZagS = false;InfS = false;PFileStream.Close();PFileStream.Dispose();}if (DekMes[1] == Convert.ToByte('I')){if (DekMes.Count() == DekMes[2] + 4){if (ZagR == false){for (int i = 0; i <Convert.ToInt32(DekMes[2]); i++){mess = mess + Convert.ToChar(DekMes[3+ i]);}ZagR = true;ACK();if (MessageBox.Show("Принять файл " + mess+ "?", "Согласие на передачу", MessageBoxButton.YesNo) == MessageBoxResult.Yes){if (Sohranenie(mess) == true){ZagR = true;UIContext.Send(d =>button1.IsEnabled = false, null);UIContext.Send(d =>MenuItem_Action.IsEnabled = false, null);UIContext.Send(d =>label4.Visibility = Visibility.Visible, null);YES();}else{NO();ZagR = false;InfR = false;ZagS = false;InfS = false;}}else{NO();ZagR = false;InfR = false;ZagS = false;InfS = false;}}else{ACK();PFileStream.Write(DekMes, 3,Convert.ToInt32(DekMes[2]));}}else{ChisloPovtorov++;if (ChisloPovtorov >= 5){UIContext.Send(d => label4.Visibility =Visibility.Hidden, null);11UIContext.Send(d =>MenuItem_Action.IsEnabled = true, null);UIContext.Send(d => button1.IsEnabled =true, null);MessageBox.Show("Во время передачивозникла ошибка!\nПередача прервана!");ZagR = false;InfR = false;ZagS = false;InfS = false;ChisloPovtorov = 0;PFileStream.Close();PFileStream.Dispose();}NAK();}}}}}}}4,4,4,4,4,void ACK(){ComPort.RtsEnable = false;ComPort.Write(Kodir(Upakovat('A'),"1011").Count());ComPort.RtsEnable = true;}void NAK(){ComPort.RtsEnable = false;ComPort.Write(Kodir(Upakovat('R'),"1011").Count());ComPort.RtsEnable = true;}void YES(){ComPort.RtsEnable = false;ComPort.Write(Kodir(Upakovat('Y'),"1011").Count());ComPort.RtsEnable = true;}void NO(){ComPort.RtsEnable = false;ComPort.Write(Kodir(Upakovat('N'),"1011").Count());ComPort.RtsEnable = true;}void EOT(){ComPort.RtsEnable = false;ComPort.Write(Kodir(Upakovat('E'),"1011").Count());ComPort.RtsEnable = true;}4, "1011"), 0, Kodir(Upakovat('A'),4, "1011"), 0, Kodir(Upakovat('R'),4, "1011"), 0, Kodir(Upakovat('Y'),4, "1011"), 0, Kodir(Upakovat('N'),4, "1011"), 0, Kodir(Upakovat('E'),bool? Sohranenie(string Zagolovok){SaveFileDialog purposeBrowse = new SaveFileDialog();purposeBrowse.AddExtension = true;purposeBrowse.Title = "Выберите место для сохранения файла";purposeBrowse.FileName = Zagolovok;bool? BrowseWr = purposeBrowse.ShowDialog();if (BrowseWr == true)12{PurposePath = purposeBrowse.FileName;PFileStream = new FileStream(PurposePath, FileMode.Create,FileAccess.Write);}return BrowseWr;}byte[] Upakovat(char Type){byte[] VByte;if (Type == 'A' || Type == 'R' || Type == 'Y' || Type == 'N' || Type== 'E'){VByte = new byte[3];VByte[0] = Byte.Parse("FF",System.Globalization.NumberStyles.AllowHexSpecifier);VByte[1] = Convert.ToByte(Type);VByte[2] = Byte.Parse("FF",System.Globalization.NumberStyles.AllowHexSpecifier);}else{VByte = new byte[0];}return VByte;}byte[] Upakovat(byte[] InfByte, char Type, long Length){byte[] VByte;if (Type == 'I'){VByte = new byte[Length + 4];VByte[0] = Byte.Parse("FF",System.Globalization.NumberStyles.AllowHexSpecifier);VByte[1] = Convert.ToByte(Type);VByte[2] = Convert.ToByte(Length);for (int i = 3, j = 0; i < Length + 3; i++, j++){VByte[i] = InfByte[j];}VByte[Length + 3] = Byte.Parse("FF",System.Globalization.NumberStyles.AllowHexSpecifier);}else{VByte = new byte[0];}return VByte;}byte[] Kodir(byte[] Ish, int k, string PorPolinom){byte[] Vih;int n = Ish.Count();string s = "";string p = "";string s1 = "";for (int i = 0; i < n; i++){s1 = Convert.ToString(Ish[i], 2);for (int j = 0; s1.Count() < 8; j++){s1 = "0" + s1;}s = s + s1;13}string Nuli = "";for (int i = 0; i < PorPolinom.Count() - 1; i++){Nuli = Nuli + "0";}for (int inach = 0, ikon = 0; ikon < s.Count(); ikon++){if ((ikon + 1) % k == 0){p = p + s.Substring(inach, k) + VichOstatka(s.Substring(inach,k) + Nuli, PorPolinom);inach = ikon + 1;}}int U = 8 - p.Count() % 8;for (int i = 0; i < U; i++){p = p + "0";}Vih = new byte[p.Count() / 8];for (int i = 0; i < p.Count() / 8; i++){Vih[i] = Convert.ToByte(p.Substring(8 * i, 8), 2);}return Vih;}string VichOstatka(string Delimoe, string PorPolinom){string Chastnoe;int n = PorPolinom.Count();for (int i = 0; i < Delimoe.Count() - n + 1; i++){if (Delimoe[i] == PorPolinom[0]){Delimoe = Delimoe.Remove(i, 1);Delimoe = Delimoe.Insert(i, "0");for (int j = 1; j < n; j++){if (Delimoe[i + j] == PorPolinom[j]){Delimoe = Delimoe.Remove(i + j, 1);Delimoe = Delimoe.Insert(i + j, "0");}else{Delimoe = Delimoe.Remove(i + j, 1);Delimoe = Delimoe.Insert(i + j, "1");}}}}Chastnoe = Delimoe.Substring(Delimoe.Count() - n + 1);return Chastnoe;}byte[] Dekodir(string Ish, int k, string PorPolinom){byte[] Vih;string p = "";for (int i = 0; i < Ish.Count() - k - PorPolinom.Count() + 1; i += k +PorPolinom.Count() - 1){p = p + Ish.Substring(i, k);}Vih = new byte[p.Count() / 8];14for (int i = 0; i < p.Count() / 8; i++){Vih[i] = Convert.ToByte(p.Substring(8 * i, 8), 2);}return Vih;}bool Proverka(string Ish, int k, string PorPolinom){bool Oshibka = false;string Nuli = "";for (int i = 0; i < PorPolinom.Count() - 1; i++){Nuli = Nuli + "0";}for (int i = 0; i < Ish.Count() - k - PorPolinom.Count() + 1; i += k +PorPolinom.Count() - 1){if (VichOstatka(Ish.Substring(i, k + PorPolinom.Count() - 1),PorPolinom) != Nuli){Oshibka = true;break;}}return Oshibka;}private void MenuItemClose_Click(object sender, RoutedEventArgs e){Close();}private void MenuItemHelpA_Click(object sender, RoutedEventArgs e){MessageBox.Show("Программа предназначена для передачи файла междудвумя ЭВМ, соединенными нуль-модемно, через COM-порт.\nДля передачи файла нажмитекнопку \"Отправить файл\" или выберите пункт \"Отправить файл\" в меню\"Действия\"","О программе");}private void MenuItemHelpD_Click(object sender, RoutedEventArgs e){MessageBox.Show("Выполнена в рамках курса \"Сетеввыетехнологии\"\nИсполнители:\tГоликов С.В.
ИУ5-72\n\t\tНиколаев С.К. ИУ572\n\t\tЧаплыгина А.А. ИУ5-72\nПреподаватель:\tГалкин В.А.", "Разработка");}}}15.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.















