Министерство цифрового развития, связи и массовых коммуникаций
Российской Федерации
Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования
«Московский технический университет связи и информатики»
_____________________________________________________________
Кафедра Системного программирования
КУРСОВАЯ РАБОТА
по дисциплине
ОПЕРАЦИОННЫЕ СИСТЕМЫ
на тему:
«ИССЛЕДОВАНИЕ МЕХАНИЗМОВ МЕЖПРОЦЕССНОГО ВЗАИМОДЕЙСТВИЯ»
Выполнил:
студент Рахимов Егор Константинович
(Ф.И.О.)
группа_______БФИ1901_________
Проверил:
Алексанян Диана Ашотовна - ассистент
(Ф.И.О., должность преподавателя)
Оценка_________________________
Дата ___________________________
Москва 2021
СОДЕРЖАНИЕ
ВВЕДЕНИЕ 3
1 ЗАДАНИЕ НА КУРСОВУЮ РАБОТУ 4
1.1 ДОПОЛНИТЕЛЬНЫЕ ЗАДАНИЯ 4
2 ЦЕЛЬ КУРСОВОЙ РАБОТЫ 4
3 ПОСТАНОВКА ЗАДАЧИ 4
4 ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ 4
5 РАЗРАБОТКА И ОПИСАНИЕ АЛГОРИТМА 5
6 ОПИСАНИЕ СТРУКТУРЫ ПРОГРАММЫ 6
7 РЕЗУЛЬТАТЫ ПРОГРАММЫ 6
8 ИСХОДНЫЙ КОД 8
8.1 ИСХОДНЫЙ КОД ПЕРВОГО СЕРВЕРА 8
8.1.1 Файл «Program.cs» 8
8.1.2 Файл «Form1.cs» 9
8.1.3 Файл «Server2.cs» 22
8.1.4 Файл «Server1.cs» 32
ЗАКЛЮЧЕНИЕ 39
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 40
Клиент и сервер это программы, расположенное на разных компьютерах, в разных контроллерах и других подобных устройствах. Между собой они взаимодействуют через вычислительную сеть с помощью сетевых протоколов(TCP/IP).
Программы-серверы являются поставщиками услуг. Они постоянно ожидают запросы от программ-клиентов и предоставляют им свои услуги (передают данные, решают вычислительные задачи, управляют чем-либо и т.п.). Сервер должен быть постоянно включен и “прослушивать” сеть. Каждая программа-сервер, как правило, может выполнять запросы от нескольких программ-клиентов.
Программа-клиент является инициатором запроса, который может произвести в любой момент. В отличие от сервера клиент не должен быть постоянно включен. Достаточно подключиться в момент запроса.
В наше время практически во всех сферах жизни человеческого общества применяются те или иные системы обработки данных. Это могут быть банковские системы, промышленные программные комплексы, средства автоматизации торговли и многие другие приложения. Постоянное расширение областей применения вычислительной техники и всевозрастающая сложность решаемых задач требуют совершенствования методов создания современных информационных систем.
Разработать многозадачное приложение, выполняющее получение, сбор и вывод системной информации в соответствии с вариантом задания (таблица 1).
Таблица 1- Индивидуальные варианты заданий
Вариант |
Сервер 1 |
Сервер 2 |
|
получает/выполняет и возвращает в качестве результата |
|
25 |
|
|
При обновлении информации на клиенте по таймеру данные передается только в том случае, если что-либо изменилось с момента прошлого обновления.
Обновление информации на клиенте происходит по инициативе сервера как реакция на изменения на сервере.
Целью данной курсовой работы является закрепление и углубление теоретических знаний в области современных операционных систем, приобретение практических навыков разработки клиент-серверных приложений, использующих стандартные механизмы межпроцессного взаимодействия.
В соответствии с заданием нужно разработать 3 отдельных приложения. Приложение-сервер должно выполнять такие функции: получение информации в соответствие с заданием, отправка данных на клиент-приложение. Приложение-клиент должно выполнять такие функции: отправка запроса серверу, получение информации и вывод ее на экран. Приложения должны быть разработаны по технологии «клиент-сервер». Метод коммуникации между процессами – сокеты.
Модели клиент-сервер - это технология взаимодействия в информационной сети. Сервер обладает правом управления тем или иным ресурсом, а клиент - пользования им. Понятия "клиент" и "сервер" описывают лишь распределение ролей при выполнении конкретной задачи, но не какие-либо отдельные виды компьютеров или программ. На одном и том же компьютере могут одновременно работать программы, выполняющие как клиентские, так и серверные функции.
Каждый конкретный сервер определяется видом того ресурса, которым он владеет. Этот принцип распространяется и на взаимодействие программ. Программа, выполняющая предоставление соответствующего набора услуг, рассматривается в качестве сервера, а программы, пользующиеся этими услугами, принято называть клиентами. Программы имеют распределенный характер, т.е. одна часть функций прикладной программы реализуется в программе-клиенте, а другая - в программе-сервере, а для их взаимодействия определяется некоторый протокол. Программа клиент взаимодействует с сервером, используя определенный протокол, устанавливающий правила обмена данными. Клиент может запрашивать с сервера какие-либо документы, манипулировать данными непосредственно на сервере, запускать на нем новые программы и т. п. Полученные от сервера данные клиент может предоставлять пользователю или формировать на их основе новый запрос. Клиент и сервер могут работать как на одном и том же компьютере, так и на разных. Во втором случае для обмена информацией между ними используется сетевое соединение.
Преимущества клиент-серверной архитектуры:
делает возможным, в большинстве случаев, распределение функций вычислительной системы между несколькими независимыми компьютерами в сети;
все данные хранятся на сервере, который, как правило, защищён гораздо лучше большинства клиентов. На сервере проще обеспечить контроль полномочий, чтобы разрешать доступ к данным только клиентам с соответствующими правами доступа;
позволяет объединить различные клиенты. Использовать ресурсы одного сервера часто могут клиенты с разными аппаратными платформами, операционными системами и т.п.
Недостатки клиент-серверной архитектуры:
неработоспособность сервера может сделать неработоспособной всю вычислительную сеть;
поддержка работы данной системы требует отдельного специалиста -- системного администратора;
высокая стоимость оборудования.
Для того чтобы наглядно рассмотреть процесс взаимодействия клиента и серверов, составим диаграмму компонентов и определим их роли, а также укажем связь между ними.
На рисунке 1 изображена диаграмма компонентов:
Рисунок 1 – Диаграмма компонентов
На полученной диаграмме наглядно видно, как взаимодействуют между собой клиент и сервер (в обе стороны, в форме «запрос-ответ»), сервер и сервер (не взаимодействуют), а также с помощью заметок можно понять задачи, которые ставятся перед компонентами.
Запускаем Client.exe, Server1.exe, Server2.exe. В клиент-приложении нужно обязательно указать IP адрес устройства, на котором запущены серверы, иначе не будет установлено соединение между устройствами и не будет осуществлена передача данных. Далее выбирается сервер, который будет передавать данные. Клиент отправляет запрос с помощью сокетов и возвращает на экран данные от выбранного сервера. Также реализован запуск серверов в единственном экземпляре с помощью мьютексов, т.е. сервер может быть только один, а клиентов, обращающихся к серверу – много.
На рисунках 2-4 представлены результаты работы приложения. На рисунке 2 изображен функционал кнопки, а именно интерфейс. На рисунке 3 представлен результат работы 1-го сервера, а именно вывод названия видеоадаптера и размер клиента . На рисунке 4 представлен результат работы 2-го сервера, а именно вывод процента использования виртуальной и физической памяти.
Рисунок 2 – Вывод задания на курсовую работу
Рисунок 3 - Результат вывода информации с первого сервера
Рисунок 4 – Результат вывода информации с второго сервера
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace Server1
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
bool onlyInstance;
Mutex mtx = new Mutex(true, "Server1", out onlyInstance);
if (onlyInstance)
Application.Run(new Form1());
else
MessageBox.Show("Приложение уже запущено", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Stop);
mtx.ReleaseMutex();
mtx.Close();
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Diagnostics;
using System.Threading;
namespace ClientOs
{
public partial class Form1 : Form
{
public static int port = 9305;
public static int numb = 1;
public static bool inloop = false;
public static string lastMSG = " ";
public static string forset = "";
public static string uslov = "";
public static string address = "127.0.0.1";
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)//connect 1 ser
{
ConServеtwo();
}
public void ConServеtwo()
{
address = "127.0.0.1";
port = 9305;
try
{
IPEndPoint ipPoint1 = new IPEndPoint(IPAddress.Parse(address), port);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// подключаемся к удаленному хосту
socket.Connect(ipPoint1);
string message = "GetPort!" + numb;
byte[] dataBuf = Encoding.Unicode.GetBytes(message);
socket.Send(dataBuf);
// получаем ответ
dataBuf = new byte[256]; // буфер для ответа
StringBuilder strBuilder = new StringBuilder();
int bytes = 0; // количество полученных байт
do
{
bytes = socket.Receive(dataBuf, dataBuf.Length, 0);
strBuilder.Append(Encoding.Unicode.GetString(dataBuf, 0, bytes));
}
while (socket.Available > 0);
port = int.Parse(strBuilder.ToString());
// закрываем сокет
mainTextBox1.Text += "Подключение открылось на порту : " + strBuilder.ToString() + "\n";
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
catch (Exception ex)
{
mainTextBox1.Text += ex.Message + "\n";
}
}
public void viklSer2()
{
address = "127.0.0.1";
port = 9305;
try
{
IPEndPoint ipPointForFirstServ = new IPEndPoint(IPAddress.Parse(address), port);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// подключаемся к удаленному хосту
socket.Connect(ipPointForFirstServ);
string message = "brkpt!" + numb;
byte[] data = Encoding.Unicode.GetBytes(message);
socket.Send(data);
// получаем ответ
data = new byte[1024]; // буфер для ответа
StringBuilder builder = new StringBuilder();
int bytes = 0; // количество полученных байт
mainTextBox1.Text += bytes;
do
{
bytes = socket.Receive(data, data.Length, 0);
mainTextBox1.Text += bytes;
builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
}
while (socket.Available > 0);
mainTextBox1.Text += "Подключение завершилось на порту : "+ builder.ToString() + "\n";
// закрываем сокет
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}