Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Транспортный протокол UDP



Постановка задачи

Используя данные методические указания создать сетевое приложение в среде Microsoft Visual Studio Express 2013. По результатам ЛР1 должно быть создано два проекта на языке C#. Клиент должен иметь возможность сделать запрос времени и даты с сервера. Взаимодействие должно происходить в асинхронном режиме по UDP протоколу.

В отчете представляются: название работы, постановка задачи, результаты, скриншоты программы и вывод.

2. Краткая теоретическая справка

Интерфейс сокетов

В стеке протоколов TCP/IP интерфейс сокетов отвечает за взаимодействие сетевых приложений и протоколов транспортного уровня (рис. 2.1).

Протокол – это соглашение о порядке взаимодействия программ.

Рисунок 2.1 Стек протоколов TCP/IP и интерфейс сокетов

Взаимодействие с сокетами напоминает работу с файлами или терминалом (рис. 2.2). Необходимо понимать, что сокеты являются абстракцией, то есть они не существуют физически в виде какого-либо устройства. Приложение в ходе своей работы может создавать объекты, соответствующие сокетам, и использовать их для установления соединения и отправки сообщений другим приложениям.

Сокет – программный интерфейс для обмена данными между процессами.

Рисунок 2.2 Приложение и интерфейс сокетов

Адресат может располагаться на том же самом компьютере, в локальной сети или в глобальной сети Интернет.

Клиент и сервер

При взаимодействии двух программ важно заранее определиться какая программа будет инициировать передачу данных и в каких случаях можно ожидать ответной передачи. Сервер рассматривается как долгоживущая программа, которая отправляет сообщения исключительно в ответ на запросы. Другой стороной является клиент, например, браузер, который всегда начинает взаимодействие с сервером первым. Деление на клиенты и серверы характерно для большинства сетевых приложений, так как и протокол, и сами программы упрощаются, если предоставить возможность делать запросы только клиенту. Таким образом, взаимодействие между двумя приложениями может быть разделено на взаимодействие двух сокетов между собой и двух приложений со своими сокетами (рис. 2.3).

Рисунок 2.3 Взаимодействие процессов на клиенте и сервере с помощью сокетов

С точки зрения клиентского приложения сокет на стороне сервера получает запросы и отвечает на них, а с точки зрения серверного приложения сокет на стороне клиента запрашивает информацию на сервере и нуждается в ее получении. Создание сервером и клиентом сокетов и правильное указание IP-адресов позволяет передавать и принимать сообщения. За все остальное клиент-серверное взаимодействие отвечают протоколы стека TCP/IP.

Клиент – это вычислительная машина, которая запрашивает сервис и пользуется им.

Сервер – это вычислительная машина, которая предоставляет сервис.

Сервис может предоставляться сразу нескольким клиентам. Клиент обязан запросить и инициализировать работу с сервисом, а IP-адрес и порт сервера должны быть известны клиенту. Взаимодействие осуществляется с помощью обмена сообщениями.

Транспортный протокол UDP

Не будет большой ошибкой сказать, что клиентское и серверное приложения взаимодействуют по сетевому протоколу, однако фактически в большинстве случаев используется несколько протоколов различных уровней. Хотя клиент и сервер устанавливают соединение с использованием протокола уровня приложений, транспортные уровни устанавливают соединение, используя UDP или TCP. Обратите внимание, что в действительности сообщение, отправленное с клиента на сервер идет вниз по стеку протоколов на клиенте, затем по сети и, наконец, вверх по стеку протоколов на сервере.

В ЛР используется протокол UDP (User Datagram Protocol). Он не гарантирует надежной доставки всех сообщений, не контролирует порядок их доставки. Исправление ошибок в таком случае выполняется протоколами другого уровня (например, прикладного).

Дейтаграмма – блок информации, отправленный по каналу связи без предварительного установления соединения.

Задача протокола UDP – передача данных между прикладными процессами без гарантий доставки. Прикладной процесс однозначно определяется в сети: IP-адресом и номером порта. Протокол UDP мультиплексирует и демультиплексирует процессы на основе портов.

Порт – это идентификатор приложения, который определяет обменный буфер, создаваемый операционной системой в оперативной памяти.

Для корректной работы клиент и сервер должны знать порты друг друга. Заголовок UDP содержит поля: порт источника, порт адресата, длину передаваемого сообщения и поле проверки четности. Заголовок UDP занимает 8 байт и дописывается к каждой отправляемой дейтаграмме.

2.4. Сокеты и язык C#

В ЛР рассмотрен конкретный пример, на котором можно научиться применять сокеты для передачи данных по локальной сети.

Клиент и сервер времени и даты реализуются на языке C# и платформе .NET. Этот язык программирования разработан компанией Microsoft, а сама платформа ориентирована на системы, работающие под управлением операционных систем Microsoft Windows. Для разработки в данной ЛР используется среда Microsoft Visual Studio Express 2013 (далее, VS).

Язык C# основан на объектно-ориентированной парадигме программирования, основными понятиями которой являются классы и объекты.

Класс — это модель не существующего объекта, описанная на языке программирования.

Методы — процедуры и функции, связанные с классом.

Поля данных — значения, объявленные как принадлежащие классу.

Объект — это сущность в адресном пространстве ПК, появляющаяся при создании экземпляра класса.

При инкапсуляции  данные и методы их обработки объединяются в класс, а детали реализации скрываются от пользователя.

За сетевое взаимодействие в этом языке отвечают пространства имен System.Net.Sockets и System.Net. Платформа .NET предоставляет класс Socket для работы с библиотекой Winsock32. Библиотека Winsock32 используется для работы с сокетами во всех версиях MS Windows.

Класс Socket поддерживает две основные модели взаимодействия, синхронную и асинхронную. В синхронном режиме вызов сетевых методов отправки и приема данных приостанавливает работу программы. В асинхронном режиме эти методы работают в отдельном потоке, а управление мгновенно возвращается программе. В ЛР используется асинхронный режим работы сокетов. Клиент и сервер взаимодействуют по протоколу UDP.

Для работы по протоколу UDP создается дейтаграммный сокет. Для работы двух дейтаграммных сокетов не нужно наличие постоянного соединения. В соответствии с протоколом UDP при работе с данными сокетами не используются алгоритмы, гарантирующие доставку данных (рис. 2.4).

Рисунок 2.4 Взаимодействие с сервером по дейтаграммному сокету

Дейтаграммный сокет должен быть связан с локальным адресом. Локальный адрес состоит из IP-адреса узла и номера порта и определяется в C# объектами классов EndPoint и IPEndPoint. Если ПК имеет несколько IP-адресов, то сокет может быть связан не только с конкретным адресом, но и со вмести сразу: для этого вместо IP-адреса следует указать константу IPAddress.Any. Связывание осуществляется вызовом метода Bind(). Для UDP приложения необходимо выбрать заранее определенный порт, но помнить, что часть портов используются в рамках всей сети Интернет: 21 для FTP, 23 для telnet, 25 для SMTP, 80 для WEB, 110 для POP3 и т.д.

Для асинхронной передачи и приема данных с помощью дейтаграммного сокета применяются методы BeginSendTo() и BeginReceiveFrom(). Метод требует BeginSendTo() явного указания адреса получателя. Метод BeginReceiveFrom() принимает все дейтаграммы, приходящие на заданный UDP-порт со всех IP-адресов и портов.

Процедура закрытия активного соединения происходит с помощью метода Close().

Ход работы

Создание проекта в VS

Открытие окна «Панель элементов»

На экране возникнут окна «Конструктор», «Обозреватель решений», «Свойства» и «Вывод». Во вкладке «Панель элементов» откройте список «Стандартные элементы управления» (рис. 3.2).

Рисунок 3.2 Интерфейс панели элементов

С помощью панели инструментов создается графический интерфейс (graphical user interface, GUI) программы.

Создание клиента

Создание GUI клиента

Перетащите два элемента типа Button, пять элементов типа Label и шесть элементов типа TextBox на форму Form1 и расположите их, как показано на рис. 4.1.

Рисунок 4.1 GUI клиента

Надписи в элементах типа TextBox вводить необязательно.

Метод ClientStart()

Пользователь должен иметь возможность включать и выключать клиентское приложение. Для этого необходимо реализовать методы запуска и остановки работы клиента. Для запуска клиента мы будем использовать закрытый метод ClientStart():

private void ClientStart()

{

try

{

clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

IPAddress ipAddress;

if (!IPAddress.TryParse(textBox1.Text, out ipAddress))

ipAddress = IPAddress.Parse("127.0.0.1");

Int32 port;

if (!Int32.TryParse(textBox2.Text, out port))

port = 40001;

EndPoint epClient = (EndPoint)new IPEndPoint(ipAddress, port);

clientSocket.Bind(epClient);

EndPoint epSender = (EndPoint)new IPEndPoint(IPAddress.Any, 0);

clientSocket.BeginReceiveFrom(byteDataRecv, 0, byteDataRecv.Length, SocketFlags.None, ref epSender, new AsyncCallback(ReceiveCallback), null);

textBox6.Text = "Клиент запущен (" + epClient.ToString() + ")";

button1.Text = "Стоп";

button2.Enabled = true;

isClientSocketClosed = false;

}

catch (Exception ex)

{

textBox6.Text = "При создании сокета возникла ошибка";

MessageBox.Show(ex.Message, "Клиент времени и даты", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

Исполняемый код помещен в блок try, а обработка возможных ошибок в блок catch. С помощью оператора создается дейтаграммный сокет, работающий по протоколу UDP. Сокету должна соответствовать пара из IP-адреса и порта, которая называется EndPoint (или IPEndPoint). Значения задаются полями Text элементов textBox1и textBox2 с помощью метода TryParse. Если этот метод возвращает false, то выбираются значения по-умолчанию.

Созданный объект epClient привязывается к сокету с помощью метода Bind. Создается дополнительный объект epSender для фиксирования IP-адреса и порта другой стороны передачи. Сокет устанавливается в режим асинхронного приема в отдельном потоке с помощью метода BeginReceiveFrom.

Метод ReceiveCallback()

Каждый принятая дейтаграмма будет вызывать срабатывание метода ReceiveCallback():

private void ReceiveCallback(IAsyncResult ar)

{

try

{

EndPoint epSender = (EndPoint)new IPEndPoint(IPAddress.Any, 0);

int bytesRead = clientSocket.EndReceiveFrom(ar, ref epSender);

if (bytesRead > 0)

{

          string stringRead = Encoding.UTF8.GetString(byteDataRecv, 0, bytesRead);

MessageBox.Show(Form1.ActiveForm, "Сообщение '" + stringRead + "' длиной " + bytesRead.ToString() + " принято от сервера времени и даты " + epSender.ToString(), "Время и дата", MessageBoxButtons.OK, MessageBoxIcon.Information);

Array.Clear(byteDataRecv, 0, bytesRead);

clientSocket.BeginReceiveFrom(byteDataRecv, 0, byteDataRecv.Length, SocketFlags.None, ref epSender, new AsyncCallback(ReceiveCallback), null);

}

}

catch (ObjectDisposedException)

{

if (isClientSocketClosed)

          return;

}

catch (Exception ex)

{

    MessageBox.Show(ex.Message, "Клиент времени и даты", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

В результате работы метода EndReceiveFrom в целочисленную переменную bytesRead записывается количество принятых байтов информации, а в epSender – IP-адрес и порт отправителя. Само сообщение хранится в байтовом массиве byteDataRecv. Если сообщение было принято, то его содержание и отправитель выводятся в информационном окне. Байтовый массив очищается методом Array.Clear, а сокет опять устанавливается в режим асинхронного приема.

Метод ClientStop()

Для завершения работы с сокетом используется метод ClientStop():

private void ClientStop()

{

try

{

    if (!isClientSocketClosed)

{

clientSocket.Close();

          button1.Text = "Старт";

          button2.Enabled = false;

          textBox6.Text = "Работа клиента прекращена";

  isClientSocketClosed = true;

}

}

catch (Exception ex)

{

    MessageBox.Show(ex.Message, "Клиент времени и даты", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

Закрытие сокета должно сопровождаться установлением булевой переменной в состояние true.

Событие Click

Используем кнопку button1 для вызова методов ClientStart() и ClientStop(). В окне «Обозреватель решений» двойным щелчком по пункту  откроем окно «Конструктор». Двойным щелчком по кнопке button1 автоматически создадим обработчик события, вызываемый в программе при нажатии пользователем этой кнопки. Добавим в тело метода вызов ClientStart() и ClientStop():

private void button1_Click(object sender, EventArgs e)

{

if (isClientSocketClosed)

    ClientStart();

else

    ClientStop();

}

В дальнейшем мы еще не раз воспользуемся этим приемом для привязки методов к событиям.

Метод Send()

Для отправки сообщений будет использоваться метод Send():

private void Send()

{

try

{

    IPAddress ipAddress;

if (!IPAddress.TryParse(textBox4.Text, out ipAddress))

          ipAddress = IPAddress.Parse("127.0.0.1");

Int32 port;

if (!Int32.TryParse(textBox5.Text, out port))

          port = 40000;

EndPoint epServer = new IPEndPoint(ipAddress, port);

byteDataSend = System.Text.Encoding.UTF8.GetBytes(textBox3.Text);

clientSocket.BeginSendTo(byteDataSend, 0, byteDataSend.Length, SocketFlags.None, epServer, new AsyncCallback(SendCallback), null);

textBox6.Text = "Сообщение '" + textBox3.Text + "' отправлено " + epServer.ToString();

}

catch (ObjectDisposedException)

{

    if (isClientSocketClosed)

               return;

}

catch (Exception ex)

{

    MessageBox.Show(ex.Message, "Клиент времени и даты", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

Таким образом, отправляемое сообщение помещается в байтовый массив byteDataSend и отправляется асинхронным методом BeginSendTo в отдельном потоке по IP-адресу и порту, полученным из полей Text элементов textBox4 и textBox5 и записанным в объект epServer.

Метод SendCallback()

При окончании отправки вызывается метод SendCallback():

private void SendCallback(IAsyncResult ar)

{

try

{

    clientSocket.EndSend(ar);

}

catch (Exception ex)

{

    MessageBox.Show(ex.Message, "Клиент времени и даты", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

Самостоятельно привяжите метод Send() к нажатию кнопки button2.

Создание сервера

Создание GUI сервера

Перетащите один элемент типа Button, два элемента типа Label и три элемента типа TextBox на форму Form1 и расположите их, как показано на рис. 5.1.

Рисунок 5.1 GUI сервера

Зайдите в меню ПРОЕКТ→Назначить запускаемым проектом, чтобы в дальнейшем работать с сервером, а не с клиентом.

Метод ServerStart()

Пользователь должен иметь возможность включать и выключать серверное приложение. Для этого необходимо реализовать методы запуска и остановки работы сервера. Для запуска сервера мы будем использовать закрытый метод ServerStart():

private void ServerStart()

{

try

{

serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

IPAddress ipAddress;

if (!IPAddress.TryParse(textBox1.Text, out ipAddress))

ipAddress = IPAddress.Any;

Int32 port;

if (!Int32.TryParse(textBox2.Text, out port))

port = 40000;

EndPoint epServer = (EndPoint)new IPEndPoint(ipAddress, port);

serverSocket.Bind(epServer);

EndPoint epSender = (EndPoint)new IPEndPoint(ipAddress, 0);

serverSocket.BeginReceiveFrom(byteDataRecv, 0, byteDataRecv.Length, SocketFlags.None, ref epSender, new AsyncCallback(ReceiveCallback), epSender);

textBox3.Text = "Сервер запущен (" + epServer.ToString() + ")";

button1.Text = "Стоп";

isServerSocketClosed = false;

}

catch (Exception ex)

{

textBox3.Text = "При создании сокета возникла ошибка";

MessageBox.Show(ex.Message, "Сервер времени и даты", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

Порт, выбираемый по-умолчанию, отличается от клиентского для удобства запуска клиента и сервера на одном ПК.

Метод ReceiveCallback()

Каждый принятая дейтаграмма будет вызывать срабатывание метода ReceiveCallback():

private void ReceiveCallback(IAsyncResult ar)

{

try

{

EndPoint epSender = (EndPoint)new IPEndPoint(IPAddress.Any, 0);

int bytesRead = serverSocket.EndReceiveFrom(ar, ref epSender);

if (bytesRead > 0)

{

string stringRead = Encoding.UTF8.GetString(byteDataRecv, 0, bytesRead);

DateTime DTNow = System.DateTime.Now;

string DTString = DTNow.ToString("D", System.Globalization.CultureInfo.CreateSpecificCulture("ru-RU"));

byteDataSend = System.Text.Encoding.UTF8.GetBytes(DTString);

Array.Clear(byteDataRecv, 0, bytesRead);

serverSocket.BeginSendTo(byteDataSend, 0, byteDataSend.Length, SocketFlags.None, epSender, new AsyncCallback(SendCallback), null);

serverSocket.BeginReceiveFrom(byteDataRecv, 0, byteDataRecv.Length, SocketFlags.None, ref epSender, new AsyncCallback(ReceiveCallback), epSender);

}

}

catch (ObjectDisposedException)

{

if (isServerSocketClosed)

return;

}

catch (Exception ex)

{

MessageBox.Show(ex.Message, "Сервер времени и даты", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

Особое внимание необходимо уделить работе со временем и датой.

Метод SendCallback()

Каждая отправленная дейтаграмма приведет к вызову метода SendCallback():

private void SendCallback(IAsyncResult ar)

{

try

{

serverSocket.EndSend(ar);

}

catch (Exception ex)

{

MessageBox.Show(ex.Message, "Сервер времени и даты", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

Данный метод работает в отдельном потоке и позволяет обеспечить асинхронность отправки и приема дейтаграмм сервером.

Метод ServerStop()

Для остановки сервера используется метод ServerStop():

private void ServerStop()

{

try

{

if (!isServerSocketClosed)

{

serverSocket.Close();

textBox3.Text = "Работа сервера прекращена";

button1.Text = "Старт";

isServerSocketClosed = true;

}

}

catch (Exception ex)

{

MessageBox.Show(ex.Message, "Сервер времени и даты", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

Процедура закрытия сокета на сервере и клиенте ничем не отличается.

Выводы

Сделайте выводы по проделанной работе. Особое внимание следует уделить отличию в реализации клиента и сервера времени и даты. Какой подход к программированию сокетов использовался в ЛР? В чем состоит особенность такого подхода? Какой тип сокетов и какой протокол использовались в данной работе? Приведите пример другого протокола, который можно было бы применить? Какие ошибки могут произойти в данных приложениях, если пользователь введет заранее неверные IP-адрес и порт?

Вопросы

· Что такое сокет?

· Где в стеке протоколов TCP/IP располагается интерфейс сокетов?

· Какие подходы к реализации сокетов существуют в C#?

· Какие пространства имен используются для сетевого программирования в C#?

· Что такое сетевое протокол?

· В чем особенность протокола UDP?

· Что такое порт?

· В чем различие между UDP-клиентом и UDP-сервером?


·

Приложение A

Варианты

Номер варианта Формат даты Культура Формат времени Кодовое слово 1 Кодовое слово 2
1 "d" "ru-RU" "t" S2n28-(T 3G14CxAU
2 "d" "en-US" "t" *Iw'*M8[ SN2YuN5f
3 "d" "de-DE" "t" C(]/#(5p 35Epl924
4 "d" "fr-FR" "t" j .P{6]- XKjj5mD8
5 "D" "ru-RU" "t" d472/<dE Rpl72lnP
6 "D" "en-US" "t" i=D8lk~4 u7ZURmx7
7 "D" "de-DE" "t" m3q4=#)S 72377l2U
8 "D" "fr-FR" "t" RQ8s"){= tf8oeA3H
9 "f" "ru-RU" "t" ^.@~d3C k14K6V44
10 "f" "en-US" "T" 9iKk3[m. NJ6258pG
11 "f" "de-DE" "T" VGkp6D;k 0of561Rk
12 "f" "fr-FR" "T" j94#Y>}j jcdb9Eb4
13 "F" "ru-RU" "T" v;@|0D"0 Xp4f6o6p
14 "F" "en-US" "T" <>w7h4O| p71YX24t
15 "F" "de-DE" "T" OP+6i,OV I7Ich84I
16 "F" "fr-FR" "T" hztUW1|4 07599p2W
17 "g" "ru-RU" "T" -Y8t<}R" r8n8EZ3F
18 "g" "en-US" "T" 4#CaCf;r 43iD6Aln
19 "g" "de-DE" "T" sM6,9#9z n10Dc587
20 "g" "fr-FR" "T" 6=2Z6UwO tN530yuH

 


Постановка задачи

Используя данные методические указания создать сетевое приложение в среде Microsoft Visual Studio Express 2013. По результатам ЛР1 должно быть создано два проекта на языке C#. Клиент должен иметь возможность сделать запрос времени и даты с сервера. Взаимодействие должно происходить в асинхронном режиме по UDP протоколу.

В отчете представляются: название работы, постановка задачи, результаты, скриншоты программы и вывод.

2. Краткая теоретическая справка

Интерфейс сокетов

В стеке протоколов TCP/IP интерфейс сокетов отвечает за взаимодействие сетевых приложений и протоколов транспортного уровня (рис. 2.1).

Протокол – это соглашение о порядке взаимодействия программ.

Рисунок 2.1 Стек протоколов TCP/IP и интерфейс сокетов

Взаимодействие с сокетами напоминает работу с файлами или терминалом (рис. 2.2). Необходимо понимать, что сокеты являются абстракцией, то есть они не существуют физически в виде какого-либо устройства. Приложение в ходе своей работы может создавать объекты, соответствующие сокетам, и использовать их для установления соединения и отправки сообщений другим приложениям.

Сокет – программный интерфейс для обмена данными между процессами.

Рисунок 2.2 Приложение и интерфейс сокетов

Адресат может располагаться на том же самом компьютере, в локальной сети или в глобальной сети Интернет.

Клиент и сервер

При взаимодействии двух программ важно заранее определиться какая программа будет инициировать передачу данных и в каких случаях можно ожидать ответной передачи. Сервер рассматривается как долгоживущая программа, которая отправляет сообщения исключительно в ответ на запросы. Другой стороной является клиент, например, браузер, который всегда начинает взаимодействие с сервером первым. Деление на клиенты и серверы характерно для большинства сетевых приложений, так как и протокол, и сами программы упрощаются, если предоставить возможность делать запросы только клиенту. Таким образом, взаимодействие между двумя приложениями может быть разделено на взаимодействие двух сокетов между собой и двух приложений со своими сокетами (рис. 2.3).

Рисунок 2.3 Взаимодействие процессов на клиенте и сервере с помощью сокетов

С точки зрения клиентского приложения сокет на стороне сервера получает запросы и отвечает на них, а с точки зрения серверного приложения сокет на стороне клиента запрашивает информацию на сервере и нуждается в ее получении. Создание сервером и клиентом сокетов и правильное указание IP-адресов позволяет передавать и принимать сообщения. За все остальное клиент-серверное взаимодействие отвечают протоколы стека TCP/IP.

Клиент – это вычислительная машина, которая запрашивает сервис и пользуется им.

Сервер – это вычислительная машина, которая предоставляет сервис.

Сервис может предоставляться сразу нескольким клиентам. Клиент обязан запросить и инициализировать работу с сервисом, а IP-адрес и порт сервера должны быть известны клиенту. Взаимодействие осуществляется с помощью обмена сообщениями.

Транспортный протокол UDP

Не будет большой ошибкой сказать, что клиентское и серверное приложения взаимодействуют по сетевому протоколу, однако фактически в большинстве случаев используется несколько протоколов различных уровней. Хотя клиент и сервер устанавливают соединение с использованием протокола уровня приложений, транспортные уровни устанавливают соединение, используя UDP или TCP. Обратите внимание, что в действительности сообщение, отправленное с клиента на сервер идет вниз по стеку протоколов на клиенте, затем по сети и, наконец, вверх по стеку протоколов на сервере.

В ЛР используется протокол UDP (User Datagram Protocol). Он не гарантирует надежной доставки всех сообщений, не контролирует порядок их доставки. Исправление ошибок в таком случае выполняется протоколами другого уровня (например, прикладного).

Дейтаграмма – блок информации, отправленный по каналу связи без предварительного установления соединения.

Задача протокола UDP – передача данных между прикладными процессами без гарантий доставки. Прикладной процесс однозначно определяется в сети: IP-адресом и номером порта. Протокол UDP мультиплексирует и демультиплексирует процессы на основе портов.

Порт – это идентификатор приложения, который определяет обменный буфер, создаваемый операционной системой в оперативной памяти.

Для корректной работы клиент и сервер должны знать порты друг друга. Заголовок UDP содержит поля: порт источника, порт адресата, длину передаваемого сообщения и поле проверки четности. Заголовок UDP занимает 8 байт и дописывается к каждой отправляемой дейтаграмме.

2.4. Сокеты и язык C#

В ЛР рассмотрен конкретный пример, на котором можно научиться применять сокеты для передачи данных по локальной сети.

Клиент и сервер времени и даты реализуются на языке C# и платформе .NET. Этот язык программирования разработан компанией Microsoft, а сама платформа ориентирована на системы, работающие под управлением операционных систем Microsoft Windows. Для разработки в данной ЛР используется среда Microsoft Visual Studio Express 2013 (далее, VS).

Язык C# основан на объектно-ориентированной парадигме программирования, основными понятиями которой являются классы и объекты.

Класс — это модель не существующего объекта, описанная на языке программирования.

Методы — процедуры и функции, связанные с классом.

Поля данных — значения, объявленные как принадлежащие классу.

Объект — это сущность в адресном пространстве ПК, появляющаяся при создании экземпляра класса.

При инкапсуляции  данные и методы их обработки объединяются в класс, а детали реализации скрываются от пользователя.

За сетевое взаимодействие в этом языке отвечают пространства имен System.Net.Sockets и System.Net. Платформа .NET предоставляет класс Socket для работы с библиотекой Winsock32. Библиотека Winsock32 используется для работы с сокетами во всех версиях MS Windows.

Класс Socket поддерживает две основные модели взаимодействия, синхронную и асинхронную. В синхронном режиме вызов сетевых методов отправки и приема данных приостанавливает работу программы. В асинхронном режиме эти методы работают в отдельном потоке, а управление мгновенно возвращается программе. В ЛР используется асинхронный режим работы сокетов. Клиент и сервер взаимодействуют по протоколу UDP.

Для работы по протоколу UDP создается дейтаграммный сокет. Для работы двух дейтаграммных сокетов не нужно наличие постоянного соединения. В соответствии с протоколом UDP при работе с данными сокетами не используются алгоритмы, гарантирующие доставку данных (рис. 2.4).

Рисунок 2.4 Взаимодействие с сервером по дейтаграммному сокету

Дейтаграммный сокет должен быть связан с локальным адресом. Локальный адрес состоит из IP-адреса узла и номера порта и определяется в C# объектами классов EndPoint и IPEndPoint. Если ПК имеет несколько IP-адресов, то сокет может быть связан не только с конкретным адресом, но и со вмести сразу: для этого вместо IP-адреса следует указать константу IPAddress.Any. Связывание осуществляется вызовом метода Bind(). Для UDP приложения необходимо выбрать заранее определенный порт, но помнить, что часть портов используются в рамках всей сети Интернет: 21 для FTP, 23 для telnet, 25 для SMTP, 80 для WEB, 110 для POP3 и т.д.

Для асинхронной передачи и приема данных с помощью дейтаграммного сокета применяются методы BeginSendTo() и BeginReceiveFrom(). Метод требует BeginSendTo() явного указания адреса получателя. Метод BeginReceiveFrom() принимает все дейтаграммы, приходящие на заданный UDP-порт со всех IP-адресов и портов.

Процедура закрытия активного соединения происходит с помощью метода Close().

Ход работы

Создание проекта в VS


Поделиться:



Последнее изменение этой страницы: 2019-03-22; Просмотров: 217; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.196 с.)
Главная | Случайная страница | Обратная связь