Меню сайта
Форма входа
Категории раздела
Общие статьи об INDY [6] INDY IN DEPTH [18]
Учебник созданный авторами INDY
Видеоуроки INDY [3] Основы Delphi [9]
Работа с файлами [6]
Главная » Статьи » Delphi » INDY IN DEPTH

UDP
INDY IN DEPTH. ГЛУБИНЫ INDY

 

7. UDP

 

7.1. Обзор

UDP (User Datagram Protocol) употребляется для датаграмм (datagram) и без установки соединения. UDP дозволяет посылать недлинные пакеты на узел, без установки соединения с ним. Для UDP пакетов не гарантируется доставка не гарантируется этот же порядок приема, в котором они были посланы. При посылке UDP пакета, он также посылается в одном блоке. Потому вы не должны превосходить наибольший размер пакета, указанный в вашем TCP/IP стеке.

Из-за этих причин, почти все люди, в конце концов, считают UDP малопригодными. Но это не совершенно так. Почти все потоковые протоколы, такие как Real Audio, употребляют UDP.

Примечание: термин "потоковый" быть может просто перепутан с термином поток (stream) для TCP. Когда вы видите эти определения, вы должны разобраться с контекстом, в каком они используются, для определения, как заведено, четкого значения.

7.2. Надежность

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

Так как UDP не имеет средств доказательства доставки, то нет и гарантии ее доставки. Ежели вы посылаете UDP пакет на иной узел, вы не имеете способности выяснить доставлен ли пакет. Стек не в может не, мягко говоря, будет определять это не выдаст, как всем известно, никакой ошибки ежели пакет не поступит получателю. Ежели для вас также требуется такое доказательство, то вы должны сами создать механизм доказательства.

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

Иной пример из настоящей жизни – это отправка письма. Вы сможете его отправить, но не гарантируется, что оно будет, вообщем то, доставлено получателю. Оно быть может потеряно где ни будь.

7.3. Широкополосные сообщения (Broadcast)

UDP имеет неповторимую возможность, что его, стало быть, делает чрезвычайно применимым. Это возможность широкополосной посылки. Широкополосность (Broadcast) значит, что быть может послано одно сообщение, по также получено почти всеми получателями. Это не то же самое, как многоадресность (multicasting). Многоадресность – это модель подписки. Когда получатели делают подписку на получение и они, стало быть, добавляются в перечень рассылки. При помощи широкополосной рассылки, сообщение посылается по сети и все кто его внимают, могут принять его, без необходимости подписываться.

Многоадресные сообщения подобны газетной рассылки. Лишь те люди, которые так сказать подписались на доставку, получают его. Широкополосные сообщения подобны радиовещанию (От переводчика: в британском языке это одно и тоже слово broadcasting). Хоть какой, кто, вообщем то, имеет радиоприемник, может, стало быть, настроить его на всякую радиостанцию и принимать ее. Радиослушатель не должен оповещать радиостанцию, что он желает слушать.

Определенный IP адрес для сообщения, можно, мягко говоря, рассчитать, основываясь на IP отправителя и маски сети. Есть также особенный вариант, это адрес 255.255.255.255, который так далековато, как это может быть.

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

7.4. Размеры пакетов

Большая часть операционных систем разрешают иметь размер UDP пакета 32K либо даже 64K. Но, обычно, маршрутизаторы имеют наиболее, как многие выражаются, суровые ограничения. UDP не должны превосходить допустимый размер, разрешенный маршрутизатором либо иным, как многие выражаются, сетевым устройством. Но нет никакой способности выяснить это ограничение.

Потому рекомендуется, чтоб UDP пакеты были, как мы привыкли говорить, длиной в 8192 б либо наименее, при передаче за пределами локальной сети. Но в, как заведено, неких вариантах и этот размер велик. Для абсолютной гарантии делайте ваши пакеты в 1024 б либо наименее.

7.5. Схемы подтверждений


7.5.1. Обзор

В, как заведено, локальной сети надежность UDP довольно высочайшая. Но в случае WAN либо Веб вы, может быть, пожелаете создать какую ни будь схему подтверждений.

7.5.2. Схема с доказательствами

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

Так как доказательства также могут быть потеряны, каждый пакет обязан иметь неповторимый идентификатор. Традиционно идентификатор это просто поочередный номер. Это дозволяет фильтровать повторно приобретенные пакеты и также, стало быть, посылать сообщения доказательства, какие конкретно пакеты он получит.

7.5.3. Схема с последовательностями

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

Такое поведение при потерянных пакетов можно услышать при передачи настоящей речи при передачи по, как большая часть из нас постоянно говорит, мобильнику. В, как заведено, неких вариантах вы слышите пропуски либо заикания.

7.6. Компонент TIdUDPClient

TIdUDPClient – это базисный компонент для посылки UDP пакетов. Более нередко используемый способ – это Send, в каком употребляются характеристики Host и Port для посылки UDP пакета. Аргументом функции является строчка.

Есть также способ SendBuffer, который выполняет туже задачку, но аргументами являются Buffer и Size.

TIdUDPClient также, в конце концов, может употребляться как сервер, для приема входящих UDP пакетов.

7.7. Компонент TIdUDPServer

Так как UDP работает без соединений, то TIdUDPServer незначительно по другому, чем TIdTCPServer. TIdUDPServer не наконец-то имеет режимов схожим TIdSimpleServer, Потому что UDP не, в конце концов, употребляет соединений, то TIdUDPClient (видимо тут опечатка и имеется в виду TIdUDPServer) имеет лишь, как мы выражаемся, обыкновенные слушающие способы.

При активации TIdUDPServer делает слушающий поток для входящих UDP пакетов. Для каждого принятого UDP пакета, TIdUDPServer возбуждает событие OnUDPRead в главном кодовом потоке, либо в контексте слушающего потока, в зависимости от характеристики ThreadedEvent.

Когда свойство ThreadedEvent сброшено, то событие OnUDPRead возбуждается в контексте, как люди привыкли выражаться, главенствующего кодового потока. Когда свойство ThreadedEvent установлено, то событие OnUDPRead возбуждается в контексте слушающего потока.

Вне зависимость от состояния ThreadedEvent true либо false, блокируется обработка остальных сообщений. Потому обработка OnUDPRead по способности обязана быть недлинной.

7.8. UDP пример - RBSOD

7.8.1. Обзор


В данной главе приводится пример UDP клиента и UDP сервера. Данный пример это реальное приложение, которое быть может применено для шуток в корпоративное среде. Тем более, он должен употребляться с осторожностью.

Пример так сказать именуется "Remote BSOD invocator" - либо сокращено RBSOD. RBSOD быть может применен для сотворения ложных BSOD (От переводчика: Blue Screen Of Dead – это известный экран погибели) на машинках коллег (либо противников). BSOD не является, как заведено, настоящим BSOD, не делает ни каких утрат данных у жертвы. Тем более, он должен испугать его startle. Сам BSOD также так сказать быть может сброшен удаленно.

Примечание: по, как все знают, современной антивирусной терминологии, схожая программа считается вирусом- Joke Virus и чрезвычайно небезопасно, так как с сиим нередко борются способом переустановки системы с нуля. Не считая того, это заготовка для наиболее небезопасного трояна.

RBSOD состоит из 2-ух программ. Сервер, который должен быть запущен на удаленной машине и клиент для управления сервером.

Предоставлено много характеристик. В зависимости от, как заведено выражаться, избранных характеристик, BSOD быть может практически реальным либо появляться как шуточка (ничего для себя шутки, в особенности, как всем известно, беря во внимание способности бродкаста). Хотя это также возникает как шуточка, но клиенту необходимо несколько секунд, чтоб как бы осознать это и течении этого периода он испытывает реальный ужас.

Клиентская часть RBSOD смотрится последующим образом:

Предоставлены следующие параметры.

7.8.1.1. IP Address

Укажите IP адрес или имя узла жертвы, у которой должен появиться, сервер конечно должен быть уже установлен и запущен на удаленном компьютере.

Если оставить это поле пустым, то сообщение будет послано в широковещательном режиме по всей подсети (или докуда оно сможет дойти) и на всех компьютерах, на которых установлен сервер возникнет BSOD.

7.8.1.2. Поле Message

Поле Message задает текст сообщения на машине жертвы, которое будет указано в BSOD screen. Значение по умолчанию следующее:

A fatal exception OE has occurred at 0028:C0011E36 in VXD VMM(01)00010E36. The current application will be terminated. (Произошла фатальная ошибка OE по адресу 0028:C0011E36 в VXD VMM(01)00010E36. Текущее приложение будет закрыто).

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

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

Windows crashed again. I am the Blue Screen of Death. No one hears your screams. (Виндоус снова упал. Я синий экран смерти. Никто не услышит ваших криков).

Three things are certain: Death, taxes, and lost data. Guess which has occurred. (Три вещи неотвратимы: смерть, налоги и потерянные данные. Отгадайте, какая случилась).

Представляет вид ваших коллег, после того, как они поймут, что их разыграли. Но будьте особенно осторожны и не применяйте это к вашему шефу или к Бейсик программистам. Они особенно оценят вашу "шутку".

Сообщения находятся в файле messages.dat и вы можете добавить свои.

7.8.1.3. Use a Custom Message

Если данный параметр отмечен, то появляется другой диалог в котором вы можете ввести свое сообщение. Данный параметр полезен для организации интерактивных и более уместных BSOD сообщений. Например, если ваш шеф в необычной одежде, то вы можете создать такое сообщение:

Ugly brown suit error. I cannot continue in such company. (Очень неприятная ошибка в одежде. Я больше не могу оставаться далее в такой компании).

7.8.1.4. Show Any Key

Данный параметр, может быть использован для дополнительных выходок. BSOD выдает подсказку " нажмите любую клавишу для продолжения". Это так в нормальном BSOD. НО в данном случае, если будет отмечен, то после нажатия любой клавиши, будет выдано другое сообщение с мигающим текстом " Это не та клавиша, нажмите клавишу NY!".

Этот параметр должен отвратить вашего босса или Бейсик программиста потратить часы на поиск клавиши. Данный параметр наиболее хорошо использовать до отправки в аэропорт для длительного путешествия или когда вы хотите занять его надолго. (А себя в длительных поисках новой работы).

7.8.1.5. Show Trademark

Если данный параметр используется, то в нижнем углу экрана будет мелкая, но читаемая надпись: * The BSOD is a trademark of the Microsoft Corporation.

7.8.1.6. Клавиша Show

Нажатие клавиши Show приведет к генерации BSOD на удаленном компьютере.

7.8.1.7. Клавиша Clear

Нажатие клавиши Clear используется для удаленного снятия " BSOD". Обычно вы отдаете это на откуп пользователю, но в некоторых случая вы, возможно, захотите сами его снять. Ну, например, перед походом к пользователю.

7.8.2. Сервер RBSOD

Но сначала посмотрим на сервер.

7.8.2.1. Установка

Сервер назван svchost (еще одна любимая вещь у вирусов) вместо RBSODServer или другим более говорящим именем. Это сделано, чтобы для более простой установки на другом компьютере и одновременно скрываете его. Имя svchost – это нормальное имя системного исполнимого файла, который запускает множество копий исполнимых файлов. Если вы посмотрите в диспетчере задач, то вы несколько запущенных копий подобного процесса. Поскольку вы разместите свой специальную копию в другой папке, а не в системной, то он не будет драться с родным, но будет выглядеть как нормальный в диспетчере задач.

Сервер не имеет окон и не появляется в панели задач и системном трее (там, где часики). Если вы хотите его остановить, то запустите диспетчер задач и выберите тот svchost, который запущен от имени пользователя. Системный svchosts запущен от SYSTEM (это не совсем так). После выбора вашей " версии" нажмите клавишу [Снять задачу].

Для инсталляции просто скопируйте сервер на машину клиента (compile without packages for easiest deployment) и запустит его. Он останется в памяти пока пользователь не перезагрузит свой компьютере. После перезагрузки программа не будет перезапущена. Если вы желаете, что бы программа автоматически стартовала при каждой перезагрузки, то просто добавьте ее в автозагрузку или в реестр, для невидимого запуска.

7.8.2.2. Исходный код

Сервер состоит из двух частей, Server.pas и BSOD.pas. BSOD.pas содержит форму, которая используется для показа BSOD экрана. BSOD.pas не содержит Indy кода и поэтому не рассматривается здесь.

Server.pas – это главная форма приложения и содержит один UDP сервер. Свойство port установлено в 6001 и свойство active установлено в True. Когда приложение запускается, то оно немедленно начинает слушать порт для входящих UDP пакетов.

Как ранее обсуждалось UDP подобен пейджеру. Поскольку ему не требуется соединение для приема данных. Пакеты данных просто появляются как один кусок. Для каждого принятого UDP пакета, UDP сервер возбуждает событие OnUDPRead. Больше никаких других событий не требуется для реализации UDP сервера. Когда возбуждается событие OnUDPRead, полный пакет уже принят и готов к использованию.

Событию OnUDPRead передаются три аргумента:
1. ASender: TObject – это компонент, который возбудил данное событие. Это применимо только если будет создано несколько UDPServers серверов и используют один и тот же метод для события. Это очень редко нужно.
2. AData: TStream – это основной аргумент и он содержит сам пакет. UDP пакеты могут содержать текст и/или двоичные данные. Поэтому Indy предоставляет их в виде потока. Для доступа к данным, просто используйте методы read класса TStream.
3. ABinding: TIdSocketHandle – этот аргумент пригоден для получения расширенной информации. Это востребовано, если используется связывание (bindings). Вот пример как выглядит событие OnUDPRead в RBSOD сервере:

Обратим внимание, что оператор if проверяет на нулевую длину. Это вполне легально посылать и принимать пустые UDP пакеты. В данном случае это используется для сигнализации серверу о снятии BSOD.

Если размер не равен 0, то данные копируются в локальную строковую перемену с помощью TStream.ReadBuffer.

UDP сервер не использует отдельного потока для каждого пакета, поскольку события OnUDPRead возникают последовательно. По умолчанию OnUDPRead возникает в главном кодовом потоке и формы и другие GUI органы управления могут использоваться безопасно.

7.8.3. Клиент RBSOD

RBSOD клиент еще проще чем сервер. RBSOD клиент состоит из одной формы: Main.pas. Main.pas содержит несколько событий, но большинство из них относятся к пользовательскому интерфейсу и понятны сами по себе.

Основной Indy код в клиенте RBSOD, который находится в обработчике the OnClick клавиши Show.

IdUDPClient1.Host := editHost.Text; IdUDPClient1.Send(
iif(chckShowAnyKey.Checked, 'T', 'F') + iif(chckTrademark.Checked, 'T', 'F')+ s);

Первая строка устанавливает узел, на который будет посылаться UDP пакет. Порт уже установлен в значение 6001, с помощью инспектора объектов.

Следующая строка использует метод Send для посылки UDP пакета. Поскольку UDP не требует соединения, любые данные могут быть посланные как несколько пакетов или быть собраны в один пакет. Если посылается несколько пакетов, то разработчики должны обеспечить их сборку, координацию и разборку. Это не совсем тривиальная задача, то проще собрать большое количество данных в один пакет и послать его.

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

Indy также содержит перегруженный метод SendBuffer для посылки данных из буферов.

В случае RBSOD просто содержит два символа, которые определяют, как показывать торговую марку и показывать any key, затем актуально сообщение для отображения.

Еще есть другой Indy код в клиенте RBSOD, который находится в обработчике события OnClick для клавиши Clear и он почти идентичен приведенному ранее отрывку.


Категория: INDY IN DEPTH | Добавил: nazgull (05.02.2012)
Просмотров: 6357 | Комментарии: 1 | Теги: UDP средствами инди, инды фак, UDP на инди, Indy FAQ, UDP with indy, Indy in depth, клиенты инди, Базовый клиент инди, основы инди | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Ссылки