Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Транспортный протокол UDPСтр 1 из 4Следующая ⇒
Постановка задачи Используя данные методические указания создать сетевое приложение в среде 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 Варианты
Постановка задачи Используя данные методические указания создать сетевое приложение в среде 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; Просмотров: 219; Нарушение авторского права страницы