СОДЕРЖАНИЕ

Лабораторная работа № 1 Работа с сетевыми утилитами и протоколами прикладного уровня

Лабораторная работа № 2 Взаимодействие прикладных программ с помощью протоколов электронной почты и протоколов прикладного уровня

Лабораторная работа № 3 Взаимодействие прикладных программ с помощью транспортных протоколов сети Интернет

Лабораторная работа № 4 Разработка прикладных программ в графической среде X Window

 

 

Лабораторная работа № 1
Работа с сетевыми утилитами и протоколами
прикладного уровня

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

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

Краткие теоретические сведения

    1. Протокол и утилита удаленного доступа Telnet
    2. Протокол Telnet (Telecommunications network - Сеть связи) служит для дистанционного доступа к вычислительным ресурсам удаленных ЭВМ. Работа этого протокола основывается на концепции виртуального терминала, подключенного к удаленной ЭВМ. Это означает, что пользователь, работающей на локальной ЭВМ, может подключиться к удаленной машине (как бы далеко последняя не находилась) и работать с ней так, как если бы он пользовался терминалом, непосредственно подключенным к этой удаленной машине.

      Долгое время Telnet являлся единственным средством доступа к ресурсам удаленных ЭВМ. И сейчас он продолжает играть важную роль, поскольку его поддерживает подавляющее большинство операционных систем, имеющих функции удаленного доступа, в то время как другие протоколы ими могут не поддерживаться. Многие сервера зачастую вообще не имеют терминалов, и тогда удаленный доступ для управления ими будет не столь уж "удаленным" - администратор просто будет вести работу с сервером с ближайшей к нему рабочей станции. Кроме того, использование протокола Telnet может оказаться единственным способом управления ресурсами удаленной ЭВМ. Это возможно, например, в следующих случаях: во-первых, когда непосредственный доступ к этой ЭВМ невозможен; во-вторых, когда эта ЭВМ является встроенной специализированной вычислительной системой, у которой в принципе нет терминалов. А поскольку встроенные вычислительные системы, предусматривающие средства сетевого доступа и управления, становятся все более распространенными, то и протокол Telnet не теряет своего значения.

      Имеется огромное разнообразие как терминалов, так и компьютеров со своими кодировками и управляющими последовательностями. Поэтому разработка протокола удаленного доступа - не такая уж простая задача. Будучи непосредственно соединенными, две машины должны обеспечивать взаимное преобразование кодировок, используемых их терминалами. Telnet решает эту проблему, включив поддержку терминалов в протокол. При установлении соединения, осуществляется настройка параметров связи и преобразования данных в соответствии с возможностями обеих сторон. Для установления и настройки соединения используются внутренние команды протокола Telnet, которые обычно недоступны пользователю (администратор может вводить их в сервисной утилите telnet с помощью специальных последовательностей команд).

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

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

      На стороне локальной ЭВМ (клиента) обычно выполняется утилита, имеющая то же название, что и протокол - telnet (в некоторых реализациях - tn). На серверной стороне запускается процесс, обрабатывающий поступающие запросы сеанса Telnet. В UNIX-системах (а также в ОС типа Linux) этот процесс обычно называется telnetd (Telnet daemon), а в ОС типа Windows NT и ей подобных (ПО производства фирмы Microsoft) - Telnet Server. Эти процессы обеспечивают установление соединения по протоколу Telnet и реализуют концепцию виртуального терминала. В сети Internet службе дистанционного доступа по протоколу Telnet отведен порт с номером 23. Протокол Telnet ведет свою историю из ОС UNIX, но сейчас он реализован во многих операционных системах и графических средах, в том числе, таких широко распространенных, как MS Windows 3.11, MS Windows 95/98, MS Windows NT и даже MS DOS.

      После установления соединения серверная утилита telnetd (или ей подобная) запускает на удаленной машине требуемые программы по командам пользователя. Данные, генерируемые при каждом нажатии клавиши на локальной клавиатуре, проходят через несколько процессов, включая telnet, telnetd и прикладные программы, к которым обращается пользователь. Порядок передачи данных показан на рис. 2. Поскольку многим прикладным программам на сервере надо взаимодействовать с терминалом, то на удаленной ЭВМ используется специальный драйвер псевдотерминала TTY (название драйвера идет из ОС UNIX).

      Для начала сеанса утилите telnet необходимо указать имя или IP-адрес ЭВМ, с которой нужно установить связь. Имя можно использовать только в том случае, когда в системе имеется какое-то средство преобразования имен в IP-адреса, например, DNS сервер. Например, для подключения к машине с адресом 205.150.89.1 надо ввести команду: "telnet 205.150.89.1", а если эта машина носит название "VL44", зарегистрированное на сервере имен, можно использовать команду: "telnet VL44". После установления соединения, как правило, необходимо пройти авторизацию доступа к машине, для чего надо ввести имя пользователя и пароль в ответ на соответствующие приглашения системы. После этого утилита telnet готова к работе.

      Если утилита telnet запущена без указания адреса ЭВМ, то она переходит в командный режим и ждет указаний пользователя. Для установления соединения в командном режиме необходимо воспользоваться командой open, параметром которой является адрес ЭВМ.

      После установления соединения диалог с удаленной машиной (сервером) протекает так, как если бы пользователь работал непосредственно с нею. Допускаются все команды ОС этой удаленной ЭВМ. Все, что вводит пользователь, воспринимается удаленной машиной (сервером), а не локальной машиной (клиентом). Если, например, ввести команду просмотра текущего каталога, то пользователь получит текущий каталог ЭВМ сервера, а не клиента. Возможность выполнения введенных команд определяется, опять же, теми правами, которыми располагает данный пользователь на машине сервера (а не клиента !). Чтобы давать команды локальной ЭВМ, не завершая работу с утилитой telnet, пользователь должен перевести утилиту в командный режим. Как правило, для этого используется комбинация клавиш "Ctrl+]".

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

      Таблица 1.

      Наиболее употребительные команды утилиты telnet

    Команда

    Параметры

    Описание

    open

    адрес ЭВМ, порт

    Устанавливает соединение с указанной ЭВМ. Номер порта указывать не обязательно - тогда используется порт 23.

    close

     

    Закрывает соединение и возвращает утилиту в командный режим

    quit

     

    Завершает работу с утилитой

    mode

    режим ввода

    Устанавливает режим обмена данными ("построчный" или "посимвольный"). Удаленная ЭВМ должна уметь поддерживать требуемый режим для выполнения этой команды.

    status

     

    Отображает текущий статус утилиты: установленное соединение, адрес удаленной ЭВМ, установленный режим обмена данными

    display

    аргумент, …

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

    set

    аргумент, значение

    Устанавливает значение для указанного аргумента. Аргумент используется утилитой, как переменная окружения в ОС удаленной ЭВМ. Перечень и значения таких аргументов зависит от ОС удаленной машины (примеры переменных окружения: echo, path, eof и др.)

    Более подробно правила работы и команды, используемые утилитой telnet, рассмотрены в предлагаемой литературе. Как правило, они также описаны в любом руководстве по конкретной операционной системе.

  1. Протокол и утилита обмена файлами FTP

Протокол FTP (File Transfer Protocol - Протокол передачи файлов) предназначен для передачи файлов между машинами без установления дистанционного соединения между ними (без использования Telnet). С его помощью можно передавать файлы, работать с каталогами и пользоваться электронной почтой, но он не позволяет запускать программы на удаленной ЭВМ.

Для своей работы FTP использует транспортный протокол TCP, но связь по FTP поддерживается с помощью двух соединений: по одному из них передаются команды FTP, а по другому - данные. Поэтому программная реализация FTP предполагает работу двух процессов на каждой из взаимодействующих машин. Первый из них отвечает за передачу команд и называется протокольным интерпретатором (PI - protocol interpreter), а второй - за передачу данных и называется процессом передачи данных (DTP - data transfer process). Протокол TCP обеспечивает установление, разрыв соединения и надежность передачи данных. На удаленной ЭВМ (сервере) процессу передачи данных соответствует порт 20, а протокольному интерпретатору - порт 21.

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

В ОС типа UNIX для обслуживания запросов по FTP на удаленной машине запускается процесс ftpd (FTP daemon), в других ОС для этого могут использоваться другие процессы, предоставляющие аналогичный сервис. На локальной ЭВМ (клиенте) может выполняться любое пользовательское приложение, обеспечивающее соединение по FTP. В настоящее время разработано большое количество программ, обеспечивающих работу с этим протоколом, в том числе и программы с развитым графическим интерфейсом под ОС и графические оболочки типа MS Windows 3.11, MS Windows NT, UNIX (X Window). Но широко известна самая простейшая утилита, которая носит то же название, что и протокол - ftp. Она имеет тривиальный командный интерфейс, аналогичный интерфейсу утилиты telnet.

Общие принципы работы с утилитой ftp.

Также как при работе с утилитой telnet, при запуске утилиты ftp требуется указать имя или IP-адрес удаленной машины, с которой требуется установить соединение. Если этот адрес не указан, то ftp переходит в командный режим без установления соединения. Тогда для начала сеанса связи надо воспользоваться командой open. После того, как соединение установлено, необходимо пройти авторизацию доступа, для чего требуется ввести имя и пароль пользователя. В большинстве систем право доступа имеют только зарегистрированные пользователи, но иногда допускается так называемый "анонимный" вход, который будет рассмотрен далее. Как и при работе с telnet, при работе с ftp имя и права пользователя определяются удаленной, северной, а не локальной ЭВМ (в общем случае имена пользователя на сервере и клиенте могут быть различны). Для работы с каталогами, копирования и удаления файлов с удаленной машины пользователь должен располагать соответствующими правами, иначе эти команды выполняться не будут.

Следует обратить внимание, что и после установления соединения с удаленной ЭВМ, все команды пользователя ftp выполняются относительно локальной ЭВМ, в отличие от telnet. Особенно аккуратно следует выполнять команды копирования файлов, чтобы не потерять содержимое нужных файлов на машине-клиенте.

Протокол FTP позволяет передавать файлы в нескольких форматах, которые в общем случае системно зависимы. В большинстве систем (включая UNIX и Windows NT) определены два режима передачи файлов - текстовый и двоичный. Текстовый файл состоит из строк ASCII-символов, разделенных кодами перевода строки и возврата каретки, при его передаче выполняются действия по перекодировке символов. Для двоичных файлов не предусмотрено никакого определенного формата и никакой перекодировки, их передача осуществляется быстрее. Текстовый файл можно передавать как двоичный (в расчете произвести перекодировку на локальной машине или если перекодировка вовсе не требуется), но не наоборот.

Типичный сеанс работы с ftp включает следующие этапы:

Эти процедуры выполняются последовательно в каждом сеансе. Самые распространенные команды пользователя в утилите ftp приведены в табл. 2.

Таблица 2.

Наиболее употребительные команды утилиты ftp

Команда

Параметры

Описание

ascii

 

Переключиться в режим передачи текстовых файлов

binary

 

Переключиться в режим передачи двоичных файлов

cd

имя каталога

Сменить рабочий каталог на удаленной ЭВМ

close

 

Закрыть соединение с удаленной ЭВМ

del

имя файла

Удалить файл на удаленной ЭВМ

dir

маска файлов

Отобразить содержимое текущего каталога сервера

get

имя файла

Получить файл с удаленной ЭВМ

hash

on/off

Включить или выключить режим вывода знака "#" для каждого переданного блока данных при передаче файлов

help

 

Получить подсказку

lcd

имя каталога

Сменить рабочий каталог на локальной ЭВМ

mget

маска файлов

Получить несколько файлов с удаленной ЭВМ

mput

маска файлов

Отправить несколько файлов на удаленную ЭВМ

open

адрес ЭВМ

Установить соединение с указанной ЭВМ

put

имя файла

Передать файл на удаленную ЭВМ

pwd

 

Вывести имя текущего каталога

quote

команда

Передать команду непосредственно FTP (для ввода команд администратора)

quit

 

Завершить работу с утилитой

Более подробное описание команд утилиты ftp можно получить в предлагаемой литературе и в руководствах по работе с утилитой. Как уже было сказано выше, для различных ОС существует множество других приложений, обеспечивающих работу с протоколом FTP. Такого рода утилиты могут обладать рядом дополнительных возможностей.

Возможности работы с FTP при анонимном доступе.

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

В таких случаях для установления соединения по протоколу FTP используется метод анонимного доступа. В этом варианте в качестве имени пользователя используется слово anonymous, а вместо пароля - чаще всего слово guest (гость). Иногда для анонимного доступа может использоваться и другие варианты пароля: например, слово ftp или адрес электронной почты пользователя (в последнем случае доступ будет уже не столь анонимным, хотя, конечно, никто не проверит истинность введенных пользователем данных).

При анонимном доступе пользователь имеет, как правило, очень ограниченные права. Чаще всего при анонимном доступе пользователь может только перемещаться по ограниченному перечню каталогов и получать файлы с удаленной ЭВМ (выполнять команды get и mget).

Метод анонимного доступа - это основной метод, который используют для обмена данными по протоколу FTP программы-браузеры (browser) сети Internet, например, широко распространенные программы "Internet Explorer" и "Netscape Navigator". Эти программы имеют возможность только получать файлы с удаленных ЭВМ, в то время, как полный доступ по протоколу FTP дает пользователю также возможность передавать файлы на удаленные ЭВМ. Имя и пароль для анонимного доступа в этих программах можно настраивать.

    1. "Берклиевские утилиты" операционной системы UNIX

Одним из создателей протокола TCP/IP является Калифорнийский университет в Беркли. В нем было написано много сервисных утилит для ОС UNIX, которые обычно называют берклиевскими утилитами. Впоследствии некоторые из этих утилит были перенесены на другие операционные системы.

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

Утилита rlogin.

Утилита rlogin (от слов remote login - удаленный доступ) дает возможность пользователю получить доступ к удаленной ЭВМ. Она по своим функциям напоминает утилиту telnet, но значительно проще. Кроме того, соединение по rlogin на серверной части обслуживается другим процессом, чем соединение по telnet (как правило, он называется rlogind). Эта утилита имеет меньше возможностей по настройке типов терминала и методов обмена данными, чем telnet. При работе с rlogin каждый символ, введенный пользователем на удаленной машине, сразу же передается серверу, а каждый символ, полученный от сервера, сразу же отображается на терминале пользователя.

Утилита rlogin с точки зрения пользователя мало чем отличается от telnet. Исторически это более ранняя версия утилиты удаленного доступа, которая сохранена в ряде современных ОС для совместимости. Кроме того, она зачастую проще в использовании.

Утилита rsh.

Утилита rsh (от слов remote shell - удаленный интерпретатор команд) позволяет работать с интерпретатором команду удаленной ЭВМ. Она передает и исполняет команду пользователя в ОС сервера. В качестве прав доступа к ОС удаленной ЭВМ используются имя пользователя ОС локальной ЭВМ.

Сама утилита rsh не является интерпретатором команд. Она только передает команды на удаленную ЭВМ, где их исполняет ОС сервера, и возвращает на локальную ЭВМ (клиента) результат их выполнения. В отличие от локально исполняемых команд, для удаленно исполняемых команд возвращается только результат их исполнения, но не коды возврата (коды ошибок).

Утилита rcp.

Утилита rcp (от слов remote copy - удаленное копирование) действует подобно команде cp (copy), с помощью которой копируются файлы в ОС типа UNIX. Она имеет тот же синтаксис командной строки и те же дополнительные параметры, но к имени файла с левой стороны может быть добавлено имя удаленной ЭВМ, с которой или на которую осуществляется копирование.

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

Ограничения на использования rcp связаны с тем, что права доступа к удаленной ЭВМ регламентируются именем пользователя локальной ЭВМ. Если на удаленной ЭВМ такой пользователь отсутствует или не имеет необходимых прав, то для копирования файлов придется использовать ftp. Кроме того, далеко не все операционные системы и не все сервера в сети Internet поддерживают работу утилиты rcp.

Утилита rwho.

Утилита rwho (от слов remote who) выводит список пользователей, работающих в сети, информация о которых доступна локальной ЭВМ. Он составляется на основе данных, периодически получаемых от всех доступных машин в сети. Период обновления списков в различных сетях неодинаков, но обычно он равен одной-трем минутам.

Утилита ruptime.

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

Обе эти утилиты могут выполняться только для тех удаленных ЭВМ, на которых запущены соответствующие сервисные программы (в ОС типа UNIX такой программой является rwhod). Запускать или нет такую программу определяет администратор удаленной ЭВМ при настройке ОС сервера.

Утилита rexec.

Утилита rexec (от слов remote execution - дистанционное выполнение) служит для удаленного запуска программ и команд ОС. Порядок работы с ней почти такой же, как с rsh, но она позволяет передавать на удаленную ЭВМ (сервер) также и пароль локального пользователя. Поскольку с rsh работать быстрее и удобнее, то утилита используется редко.

Порядок выполнения работы

    1. Получить вариант задания у преподавателя.
    2. Разработать последовательность команд утилиты для выполнения задания.
    3. Подготовить и защитить отчет.
    4. Выполнить последовательность команд на ЭВМ.
    5. Продемонстрировать выполнение команд преподавателю, сравнить полученный результат с ожидаемым.

Требования к оформлению отчета

Отчет по лабораторной работе должен содержать следующие разделы:

ТИПОВЫЕ контрольные вопросы

  1. Что такое сетевые утилиты прикладного уровня и для чего они предназначены ?
  2. Какие действия позволяет выполнить сетевая утилита Telnet, каков принцип ее работы ?
  3. В чем заключается концепция виртуального сетевого терминала ?
  4. Как осуществляется соединение и взаимодействие процессов по протоколу Telnet ?
  5. Какие действия позволяет выполнить сетевая утилита FTP ?
  6. Расскажите об основных командах утилиты FTP.
  7. Как осуществляется соединение и взаимодействие процессов по протоколу FTP ?
  8. Какие возможности протокола FTP используются программами - "браузерами" ?
  9. Что такое FTP-сервер ? Для чего используется анонимное соединение с сервером ?
  10. Что такое "берклиевские утилиты", какие утилиты входят в них ?
  11. Какие возможности предоставляют утилиты rcp и rlogin ? В чем их отличие от FTP и Telnet ?
  12. Какие возможности предоставляют утилиты rsh и rexec ?

ТИПОВЫЕ Варианты заданий

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

    1. Получить удаленный доступ к серверу по выбору преподавателя. Узнать имя пользователя, присвоенное на сервере. Узнать текущий каталог на сервере. Перейти в каталог, указанный преподавателем, получить список файлов этого каталога. Сохранить протокол работы. Закрыть соединение с сервером.
    2. Получить удаленный доступ к серверу по выбору преподавателя. Узнать имя пользователя, присвоенное на сервере. Узнать текущее время и дату на сервере. Перейти в каталог, указанный преподавателем, получить список подкаталогов этого каталога. Сохранить протокол работы. Закрыть соединение с сервером.
    3. Получить удаленный доступ к серверу по выбору преподавателя. Узнать имя пользователя, присвоенное на сервере. Узнать текущий каталог на сервере. Перейти в каталог, указанный преподавателем, запустить в этом каталоге указанную программу. Сохранить протокол работы. Закрыть соединение с сервером.
    4. Получить удаленный доступ к серверу по выбору преподавателя. Перейти в каталог, указанный преподавателем. Найти в этом каталоге указанный файл и перенести его с удаленного сервера на локальную машину. Сохранить протокол работы. Закрыть соединение с сервером.
    5. Получить удаленный доступ к серверу по выбору преподавателя. Перейти в каталог, указанный преподавателем. Поместить в этот каталог указанный файл с локальной машины. Сохранить протокол работы. Закрыть соединение с сервером.
    6. Получить удаленный доступ к серверу по выбору преподавателя. Перейти в каталог, указанный преподавателем, получить список файлов этого каталога, сохранить его в файл. Перенести полученный файл с сервера на локальную машину. Сохранить протокол работы. Закрыть соединение с сервером.

Рекомендуемая литература

    1. Паркер Т. TCP/IP. Освой самостоятельно - М.: Издательство "Бином", 1997 - 448 с.: ил.
    2. Семенов Ю.А. Протоколы и ресурсы Internet - М.: Радио и связь, 1996 - 320 с.: ил.
    3. Браун С. Операционная система UNIX: Пер. с англ. - М.: Мир, 1986 - 463 с.

Лабораторная работа № 2
Взаимодействие прикладных программ с помощью протоколов электронной почты
и протоколов прикладного уровня

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

Для выполнения лабораторной работы требуется написать программу, которая выполняется под управлением ОС типа Windows или UNIX и использует для взаимодействия с другими программами заданный протокол электронной почты или иной прикладной протокол сети Internet. Для разработки программы рекомендуется использовать среду Delphi версии 3.0 или старше под управлением ОС типа Windows 95/98 или Windows NT/2000.

Краткие теоретические сведения

Протокол электронной почты SMTP

Электронная почта - это средство передачи сообщений между любыми двумя ЭВМ, имеющими соединение в сети. Принцип работы электронной почты предельно прост (и в этом сродни работе обычной, "бумажной" почты) - для того, чтобы передать сообщение, достаточно только иметь текст сообщения и знать адрес получателя. Пользователь электронной почты не должен заботится о том, каким образом и с помощью каких средств должно быть передано его сообщение. Электронная почта - это принадлежность не только сети Internet, она использовалась (и используется) также в других сетях, но с появлением всемирной сети это средство получило истинно всемирный размах, сравнявшись по широте возможностей со своим "бумажным" аналогом, а в чем-то даже превосходя его.

SMTP (Simple Mail Transfer Protocol - простой протокол электронной почты) принят в качестве стандартного метода передачи электронной почты в сети Internet. Этот протокол во многом подобен протоколу FTP. Название его вполне соответствует сути - с ним достаточно просто работать. В качестве транспортного протокола SMTP использует TCP, соединение устанавливается через порт с номером 25. Для обслуживания этого соединения используется специальная программа, которая именуется почтовым сервером. Для формирования сообщения и установления соединения используется почтовая программа (утилита) пользователя.

Главной целью протокола SMTP является надежная и эффективная доставка электронных почтовых сообщений. Для реализации протокола требуется только надежный канал связи. Средой для SMTP может служить отдельная локальная сеть, система сетей или же вся всемирная сеть Internet. Если между отправителем и получателем письма имеется непосредственная связь, адрес пользователя имеет вид имя_пользователя@адрес_ЭВМ. Когда получатель находится на ЭВМ, которая не поддерживает соединение по протоколу SMTP, и передача происходит через промежуточный сервер, то адрес получателя письма может иметь иной вид, например, имя_пользователя%имя_сервера@адрес_ЭВМ. Адреса ЭВМ в сети Internet представляют собой имя домена и преобразуются в IP-адреса согласно протоколу DNS.

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

Перечень команд протокола SMTP приведен в табл. 3. Это внутренние команды протокола. Если пользователь использует для работы с электронной почтой некоторую утилиту, то эти команды ему недоступны. Они представляют интерес только при программировании взаимодействия программ на основе этого протокола.

Таблица 3.

Внутренние команды протокола SMTP

Команда

Описание команды

DATA

Сообщение (за командой следует текст сообщения)

EXPN

Расширение списка получателей

HELO

Используется при инициализации обмена при установлении соединения

HELP

Запрос о помощи

MAIL

Адрес отправителя

NOOP

Никаких действий (пустая команда)

QUIT

Разрыв соединения

RCPT

Адрес получателя (таких команд может быть несколько)

RSET

Закончить текущую транзакцию

SAML

Послать письмо на терминал пользователя и в почтовый ящик

SEND

Послать письмо на терминал

SOML

Если можно, послать письмо на терминал, иначе - в почтовый ящик

TURN

Изменить направление передачи (отправитель и получатель меняются местами)

VRFY

Проверить имя пользователя

Через систему электронной почты передаются сообщения, которые должны иметь строго определенный формат. Этот формат достаточно прост. Любое почтовое сообщение можно разделить на три части: "конверт", заголовки и собственно текст. "Конверт" используется почтовым сервером, он содержит две команды - MAIL и RCPT (то, как они передаются серверу, описано ниже). Заголовок используется почтовой программой пользователя. Он содержит девять специальных полей: Received, From, To, Date, Subject, Message-Id, X-Phone, X-Mailer, Reply-To. Назначение этих полей понятно из их названия. Каждое из этих полей содержит имя, за которым после двоеточия идет его значения. При желании, пользователь может ознакомится с содержимым всех полей заголовка письма.

Текст сообщения должен передаваться в виде 7-разрядных символов ASCII. Конец сообщения представляет собой строку, содержащую только символы точки (".") и перевода строки. Если по каким-то причинам такая строка непосредственно встречается внутри текста сообщения, то передающая сторона автоматически дублирует точку, чтобы принимающая сторона не приняла ее за конец сообщения (на принимающей стороне дублированный символ точки в начале строки заменяется на одну точку).

С 7-битной кодировкой сообщений связана проблема пересылки писем, написанных на национальных языках, в т.ч. и на русском, поскольку для русского алфавита требуется 8-битная кодировка. Большинство современных почтовых серверов поддерживают не только 7-битные, но и 8-битные кодировки, однако, для совместимости со старыми почтовыми системами может использоваться специальная схема преобразования 8-битных кодов в 7-битные (естественно, при этом увеличивается объем сообщения, поскольку один 8-битный символ заменяется на специальную последовательность 7-битных).

Более сложная проблема заключается в том, что нет единого стандарта на кодировку русского алфавита, и поэтому на сторонах отправителя и получателя могут использоваться различные кодировки. Для того чтобы сообщение, посланное отправителем в одной кодировке, было понятно адресату, который использует другую кодировку, почтовый сервер использует специальные таблицы смены кодировок. С помощью них текст сообщения, посланного в одной кодировке, преобразуется в другую кодировку. Чтобы сервер знал, какую кодировку использовать, информация об исходной кодировке включается почтовой системой отправителя в текст или в заголовок сообщения (в зависимости от используемой системы). Одно сообщения в процессе своего прохождения через почтовые сервера может претерпеть несколько перекодировок. В случае, когда у сервера нет информации об используемой кодировке или тип кодировки указан неверно (непонятен серверу), текст сообщения может исказиться.

Передача сообщения по протоколу SMTP происходит следующим образом: после установления соединения стороны обмениваются кодами аутентификации (с помощью команд HELO), затем одна из них посылает команду MAIL, в которой указан адрес отправителя и сведения о письме. Если получатель готов к приему сообщения, он посылает положительный отклик. Далее отправитель посылает одну или несколько команд RCPT, в которых идентифицирует адресатов сообщения. Если получатель может принять сообщение для указанного адресата, то он снова выдает положительный отклик на каждую команду. После этого передается команда DATA за которой следует само письмо (сколько бы не было адресатов, само письмо передается только один раз). В конце сеанса отправитель дает команду QUIT.

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

Для того, чтобы получить сообщение из своего почтового ящика, почтовая программа пользователя соединяется с сервером уже не по протоколу SMTP, а по специальному почтовому протоколу получения сообщений. Такой протокол позволяет работать с почтовым ящиком: забирать сообщения, удалять сообщения, сортировать их и выполнять другие операции. Самым популярным в настоящее время протоколом такого рода является протокол POP3 (Post Office Protocol v.3). Он предусматривает соединение с почтовым сервером на основе транспортного протокола TCP через порт 110. Другой, более сложный, известный протокол - IMAP4.

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

Во многих версиях ОС UNIX протокол SMTP, а также другие почтовые протоколы, реализован в простейших утилитах типа sendmail или mmdf. Первая из них может служить как почтовым клиентом, так и почтовым сервером. Обычно она работает в фоновом режиме и ждет поступления сообщений от пользователя или извне. В ОС типа Windows NT ту же роль играет утилита, именуемая mdaemon (mail daemon).

Для непосредственного взаимодействия с пользователем существует простейшая программа, именуемая mail или mailx. Однако в современных ОС ею мало кто пользуется, поскольку существует большое количество прикладных программ с развитым интерфейсом, которые предоставляют пользователю возможности работы с электронной почтой. Примерами таких программ могут служить широко известные пакеты Outlook Express (производство фирмы Microsoft) и Netscape Communicator (производство фирмы Netscape). Внешний интерфейс этих программных продуктов чрезвычайно прост, так что использовать их может даже неквалифицированный пользователь. Все эти программы формируют сообщения в требуемом формате и передают их утилитам ОС, работающим в фоновом режиме, для отправки. К ним же они обращаются и для приема сообщений.

Программирование взаимодействия программ на основе прикладных протоколов

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

Во многих ОС прикладные протоколы реализованы в различных утилитах (часть из которых была рассмотрена здесь и в предыдущей работе). Эти утилиты ориентированы, прежде всего, на работу с пользователями операционных систем. Однако часто возникает необходимость осуществить обмен данными непосредственно между прикладными программами, минуя вмешательство человека или при его ограниченном участии. Тогда у разработчиков программ возникает потребность в том, чтобы сами прикладные программы могли непосредственно использовать те же самые протоколы, что и описанные выше утилиты. Естественно, к этому нет никаких препятствий - прикладные протоколы сети Internet являются открытыми протоколами, их команды и принцип работы известны и регламентированы общедоступными стандартами.

Для решения такой задачи можно, конечно, прибегнуть к вызову утилит ОС из прикладной программы с помощью командной строки. Такой подход прост в реализации, но имеет два недостатка: во-первых, скорость работы прикладной программы в этом варианте будет ниже, чем при непосредственном обмене данными по протоколу; во-вторых, необходимо параллельное выполнение утилиты ОС и прикладной программы с организацией взаимодействия между ними, что не всегда возможно. Гораздо эффективнее включить обмен данными по заданному протоколу непосредственно в код разрабатываемой прикладной программы.

Можно разработать программу, которая будет обеспечивать обмен по выбранному протоколу с любой стороны - и со стороны сервера, и со стороны клиента (в конце концов, сами все утилиты ОС - это тоже прикладные программы, которые были когда-то кем-то разработаны). Важно только, чтобы такая программа соответствовала спецификации выбранного протокола. Если же это будет не так, и вновь созданная программа не будет удовлетворять требованиям протокола или будет удовлетворять им не полностью, то она не сможет установить связь и осуществить обмен данными с другими программами и утилитами, уже существующими в сети. (Возможно, конечно, разработать две совершенно новых программы - клиента и сервера - которые будут обеспечивать обмен данными по своему протоколу, недоступному другим, но тогда такая система перестанет быть открытой системой, и по сути, перестанет быть частью всемирной сети).

Поскольку в качестве транспортного протокола для всех протоколов прикладного уровня используется TCP, то чтобы реализовать обмен данными по любому выбранному протоколу необходимо использовать обмен данными на основе именно TCP. Для этого в составе многих ОС имеются специальные библиотеки программных средств, позволяющие прикладным программам пользователя осуществлять обмен данными по протоколу TCP. В ОС типа UNIX или Linux это библиотека "сокетов" (socket - ее программный код входит в ядро ОС). В языке программирования "Си", который является базовым для этих ОС, ей обычно соответствует файл заголовков "socket.h". В ОС типа Windows NT (начиная с версии 3.5) и графических средах Windows-95/98 этот протокол реализует динамическая библиотека "WinSock.DLL" (в более ранних версиях этих ОС она не поставляется и должна устанавливаться дополнительно).

Такие библиотеки позволяют осуществлять самые простые операции: установить связь с ЭВМ, для которой известны адрес и порт связи, передать блок данных по протоколам TCP или UDP, получить блок данных, поступивший на локальную ЭВМ. Этого достаточно для того, чтобы запрограммировать любой прикладной протокол и любой обмен данными, поскольку известны все команды протоколов и используемые для обмена информацией номера портов. Однако это достаточно трудоемкий процесс, поскольку необходимо корректно запрограммировать передачу всех команд выбранного протокола и реакцию на полученные команды. Поэтому к такому методу прибегают обычно только в том случае, если нет возможности использовать стандартные прикладные протоколы и приходится организовывать обмен данными по своему, специфичному протоколу (такой подход рассматривается в следующей лабораторной работы). Для реализации стандартных прикладных протоколов уже разработано большое количество программных библиотек в различных языках программирования, поэтому нет необходимости создавать их заново.

Варианты таких библиотек в языке Object Pascal разработанные фирмой Borland для среды программирования Borland Delphi рассмотрены далее. Поскольку чаще всего возникает необходимость создать прикладную программу "клиентской" стороны протокола, то далее речь пойдет именно о создании программ такого рода.

Средства реализации прикладных протоколов Internet в среде разработки Borland Delphi

В среде программирования Borland Delphi прикладные библиотеки для реализации прикладных протоколов Internet существуют, начиная с версии 3.0 (они существуют и в более ранних версиях этой среды, но поставляются только сторонними разработчиками). Поскольку эта среда программирования основана на использовании компонентной модели, то и все прикладные протоколы Internet реализованы в ней в виде компонент.

Каждому типу протокола в среде программирования соответствует свой класс объектов, который представлен в виде компоненты в рамках среды разработки (графически он отображается в виде "иконки" при проектировании приложения). Для того, чтобы работать с выбранным протоколом, разработчик должен создать экземпляр объекта нужного класса. Это можно сделать в среде разработке при проектировании приложения или же в программном коде с помощью операторов языка программирования Object Pascal. В первом случае среда разработки автоматически выберет и подключит к коду программы нужную библиотеку, а в последнем случае это должен не забыть сделать сам разработчик.

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

В среде программирования Borland Delphi версии 3.0 для реализации протоколов FTP, SMTP и POP3 существуют классы объектов типа TFTP, TSMTP и TPOP3 соответственно (обычно они находятся на страничке "Internet" в палитре компонент). В среде программирования Borland Delphi версии 3.0 для этой же цели служат компоненты TNMFTP, TNMPOP3 и TNMSMTP (на страничке "FastNet" палитры компонент). К сожалению, названия свойств и методов (процедур и функций классов) у этих компонент несколько различаются, но суть и принципы работы с ними от этого не меняются.

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

После того, как все необходимые параметры заданы, можно инициировать обмен данными. Для этого нужно вызвать некоторый метод протокола и передать ему нужные аргументы. Тогда объект (экземпляр класса) установит соединение, а также автоматически транслирует значения всех установленных свойств в последовательность команд протокола. Когда все команды будут выполнены, прикладная программа может завершить обмен, или же, изменив какие-то данные, инициировать его снова. В процессе обмена могут возникать события, связанные, например, с разрывом соединения, ошибкой передачи данных, отсутствием прав пользователя и другими ситуациями. По многим из этих ситуаций у объектов предусмотрена активизация связанных с ними событий - функций и процедур языка программирования, в которых разработчик может предусмотреть все необходимые действия по реакции прикладной программы на событие.

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

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

Порядок выполнения работы

    1. Получить вариант задания у преподавателя.
    2. Разработать прикладную программу в соответствии с заданием.
    3. Подготовить и защитить отчет.
    4. Написать и отладить программу на ЭВМ.
    5. Сдать работающую программу преподавателю.

Требования к оформлению отчета

Отчет должен содержать следующие разделы:

Основные контрольные вопросы

  1. Что такое электронная почта, каким целям она служит ? Каковы преимущества электронной почты перед другими видами коммуникаций ? Расскажите, какие существуют варианты и протоколы организации электронной почты.
  2. Как организована передача сообщений в электронной почте, какие поля содержит заголовок сообщения ?
  3. Что такое адрес электронной почты ? Из каких полей состоит адрес ?
  4. Что такое протокол SMTP ? Как организована передача данных по этому протоколу ?
  5. Расскажите об основных командах протокола SMTP.
  6. Как организована передача сообщения по протоколу SMTP ?
  7. Почему могут возникать проблемы с передачей сообщений на русском языке через электронную почту ? Расскажите о причинах этих проблем.
  8. Что такое "почтовый ящик", для чего он используется? Что такое POP3-протокол ?
  9. Какие существуют средства для реализации протоколов Internet в прикладных программах ?
  10. Что такое библиотека "сокетов" ? Каким целям она служит ?
  11. Как реализовано программирование прикладных протоколов Internet в среде Borland Delphi ?
  12. Расскажите об общих принципах программирования работы с прикладными протоколами.

Варианты заданий

    1. Необходимо разработать программу, которая позволяет организовать прием выбранного файла с удаленной ЭВМ по протоколу FTP. Адрес ЭВМ, имя и пароль пользователя, имя и местоположения файла должны настраиваться при использовании программы. Порт обмена данными можно считать фиксированным.
    2. Необходимо разработать программу, которая позволяет организовать передачу выбранного файла на удаленную ЭВМ по протоколу FTP. Адрес ЭВМ, имя и пароль пользователя, имя и местоположения файла должны настраиваться при использовании программы. Порт обмена данными можно считать фиксированным.
    3. Необходимо разработать программу, которая позволяет организовать передачу выбранного файла на удаленную ЭВМ по протоколу FTP. Адрес ЭВМ, имя и местоположения файла должны настраиваться при использовании программы. Для регистрации на удаленной ЭВМ требуется использовать анонимный доступ. Порт обмена данными можно считать фиксированным.
    4. Необходимо разработать программу, которая позволяет организовать прием и отображение сообщения электронной почты из почтового ящика пользователя с удаленной ЭВМ по протоколу POP3. Адрес ЭВМ, имя и пароль пользователя должны настраиваться при использовании программы. Порт обмена данными можно считать фиксированным. Допускается использование только символов кодировки ASCII.
    5. Необходимо разработать программу, которая позволяет организовать передачу сообщения электронной почты на удаленную ЭВМ по протоколу SMTP. Адрес ЭВМ, имя и пароль пользователя должны настраиваться при использовании программы. Порт обмена данными можно считать фиксированным. Допускается использование только символов кодировки ASCII.
    6. Необходимо разработать программу, которая позволяет организовать передачу файла на удаленную ЭВМ по протоколу SMTP. Адрес ЭВМ, имя и пароль пользователя должны настраиваться при использовании программы. Порт обмена данными можно считать фиксированным. Допускается использование только символов кодировки ASCII.

Рекомендуемая литература

    1. Паркер Т. TCP/IP. Освой самостоятельно - М.: Издательство "Бином", 1997 - 448 с.: ил.
    2. Семенов Ю.А. Протоколы и ресурсы Internet - М.: Радио и связь, 1996 - 320 с.: ил.
    3. Шапошников И.В. Интернет-программирование - СПб.: БХВ - Санкт-Петербург, 2000 - 224 с.: ил.
    4. Калверт Чарльз Delphi 4. Энциклопедия пользователя: Пер. с англ. - Киев: Издательство "ДиаСофт", 1998 - 800 с.

Лабораторная работа № 3
Взаимодействие прикладных программ с помощью транспортных протоколов сети Интернет

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

Для выполнения лабораторной работы требуется написать программу, которая выполняется под управлением ОС типа Windows или UNIX и использует для взаимодействия с другими программами заданный протокол сети Интернет. Для разработки программы рекомендуется использовать среду Delphi версии 3.0 или старше под управлением ОС типа Windows 95/98 или Windows NT/2000.

Краткие теоретические сведения

Транспортный протокол TCP сети Internet

TCP (Transmission Control Protocol) - это один из самых широко распространенных протоколов транспортного уровня. Главная функция TCP заключается в доставке сообщений без потерь, чего не может гарантировать протокол более низкого уровня IP (Internet Protocol). Для доставки сообщений предварительно устанавливается соединение между процессом-отправителем и процессом-получателем. Данное соединение осуществляет надежную доставку дейтаграмм. Протокол TCP производит повторную передачу искаженного или утерянного пакета.

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

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

Процесс обмена данными начинается с передачи запроса на установление соединения от машины-отправителя к машине-получателю. В запросе содержится специальное целое число, называемое номером сокета (socket). В ответ получатель посылает номер своего сокета. Номера сокетов отправителя и получателя однозначно определяют соединение (конечно, соединение также не возможно без указания IP-адресов отправителя и получателя, но эта задача решается протоколами более низкого уровня - IP).

После установления соединения TCP начинает передавать сегменты сообщения. На более низком IP-уровне отправителя сегменты разбиваются на одну или несколько дейтаграмм. Пройдя через сеть, дейтаграммы поступают к получателю, где IP-уровень снова собирает из них сегменты и передает их TCP. TCP собирает все сегменты в сообщение. От TCP сообщение поступает к процессу-получателю, где обрабатывается протоколом прикладного уровня.

TCP на машине-получателе собирает целое сообщение из сегментов, руководствуясь порядковыми номерами сегментов, которые записаны в их заголовке. Если сегмент успешно принят (что проверяется по контрольной сумме и другим данным в заголовке сегмента), то получатель посылает отправителю подтверждение-квитанцию (ACK - acknowledgement). После того, как квитанция ACK будет принята на машине-отправителе, сегмент считается успешно переданным. Если какой-то сегмент сообщения потерян или поврежден, то отправитель игнорирует этот сегмент. В этом случае отправитель по истечение некоторого времени повторно передает сегмент. То же самое произойдет, если по каким-то причинам будет потеряна квитанция ACK на успешно принятый сегмент - при отсутствии квитанции сегмент считается неправильно переданным и через некоторый интервал времени передается повторно (до тех пор, пока квитанция ACK не будет получена). Поэтому на принимающей стороне могут появляться дубликаты уже принятых сегментов - такие дубликаты игнорируются, но квитанции ACK об их успешном приеме передаются. Аналогично, на передающей стороне могут приниматься дубликаты квитанций на уже переданные сегменты. Эти дубликаты просто игнорируются.

В TCP применяется средство ограничения потока данных, называемое скользящим окном. Оно представляет собой фрагмент сообщения, которые адресат готов принять. При установлении соединения отправителю сообщается размер окна (размер окна кратен размеру сегмента). После того, как отправитель передал количество байтов, соответствующее размеру окна, он должен ждать квитанции. Как только будет получена квитанция на переданные сегменты, окно сдвигается вправо на соответствующее число байтов, и новые сегменты могут быть переданы. Отправитель может передать без получения квитанций в сеть максимально столько сегментов, сколько их укладывается в скользящем окне. В процессе обмена данными получатель может присылать квитанции, в которых будет указан новый размер скользящего окна. Принципы работы скользящего окна на 7 сегментов сообщения отражены на рис. 5.

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

Номера портов и сокеты

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

Таблица 4

Номера портов наиболее употребительных служб сети Internet

Номер порта

Служба сети

Описание

0

 

Зарезервирован

7

echo

Эхо-ответ на входящие сообщения

9

discard

Сброс (поглощение) всех входящих сообщений

11

users

Активные пользователи

13

daytime

Отклик, содержащий время дня

19

chargen

Генератор символов

20

ftp data

Передача данных по протоколу FTP

21

ftp

Передача управляющих команд по протоколу FTP

23

telnet

Порт подключения по протоколу TELNET

25

smtp

Протокол передачи почтовых сообщений SMTP

37

time

Отклик, содержащий время

42

name

Сервер имен

43

whois

Кто это

53

domain

Сервер имен доменов

67

boots

Протокол удаленной загрузки сервера

68

bootc

Протокол удаленной загрузки клиента

69

tftp

Упрощенный протокол передачи файлов TFTP

79

finger

Протокол получения информации о пользователях FINGER

80

http

Протокол передачи гипертекста HTTP

109

pop2

Протокол почтового ящика POP2

110

pop3

Протокол почтового ящика POP3

111

rpc

Протокол удаленного вызова процедур RPC

156

sqlserv

Служба SQL

161

snmp

Управляющий протокол SNMP

В формате сообщения протокола TCP под номер порта отводится 16 бит, поэтому максимально возможным номером порта является число 65535. Номера портов от 0 до 255 строго зарезервированы под системные нужды, их не допускается использовать в прикладных программах. В интервале от 256 до 1023 многие порты также используются сетевыми службами, поэтому и их не рекомендуется применять для прикладных нужд. Как правило, большинство прикладных приложений, построенных на основе TCP/IP используют номера портов в диапазоне от 1024 до 5000. Рекомендуется использовать номера от 3000 до 5000, номера выше 5000 используются чаще всего для краткосрочного применения.

Любой канал связи в TCP определяется двумя числами - эта комбинация называется сокетом. Таким образом, сокет определяется IP-адресом ЭВМ и номером порта, используемым программным обеспечением TCP. При соединении любая машина однозначно определена IP-адресом, а каждый процесс - портом, поэтому соединение между двумя процессами однозначно определяется сокетом. Схема установления соединения по протоколу TCP между тремя ЭВМ в сети отражена на рис. 6.

Взаимодействующие ЭВМ ведут таблицы всех активных портов отправителей и получателей. Если между двумя машинами происходит обмен данными, то порт, который в одной из них является отправителем, в другой будет получателем и наоборот. Если машина отправитель запрашивает несколько соединений, то у каждого из них свой порт-отправитель, а порт получателя может быть общим. Несколько машин могут одновременно использовать один и тот же порт получатель, это называется мультиплексированием. На рис. 6 мультиплексирование двух соединений выполняется на ЭВМ 3 по порту номер 23.

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

Протокол передачи сообщений UDP

Протокол UDP (User Datagram Protocol) является более простым транспортным протоколом, чем протокол TCP. Он предоставляет прикладным процессам услуги транспортного уровня, которые мало чем отличаются от услуг более низкого уровня, предоставляемых протоколом IP. Протокол UDP обеспечивает доставку дейтаграмм, но не требует подтверждения их получения. Поэтому он не требует установления соединения между передающим и принимающим процессами.

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

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

Протокол UDP используется тогда, когда требуется простейший механизм передачи данных. Тогда контроль ошибок либо не выполняется (например, в прикладном протоколе TFTP - Trivial File Transfer Protocol - простейший протокол передачи файлов), либо выполняется на прикладном уровне (например, в управляющем протоколе SNMP - Simple Network Management Protocol или в файловой системе NFS - Network File System).

Сервисные утилиты ping и traceroute

При работе в сети Internet могут возникать ситуации, когда необходимо определить работоспособность того или иного узла или канала связи, а также выяснить, по какому конкретно каналу передаются сообщения. Для этой цели служат утилиты ping и traceroute. Эти утилиты, как и многие другие, были разработаны под ОС UNIX, но в настоящее время они распространены практически во всех ОС. Названия программных файлов утилит, а также формат их командной строки могут изменяться в зависимости от версии ОС, но принципы работы и назначение этих везде утилит одинаковы (например, под ОС типа Windows NT утилита traceroute носит название tracert, однако, выполняет она те же действия).

Утилита ping базируется на протоколах ICMP (Internet Control Message Protocol) и UDP. Протокол ICMP проверяет состояние сетевых устройств и формирует соответствующие сообщения. При возникновении неисправности в каком-либо устройстве он сообщает об этом остальным устройствам. ICMP работает на том же уровне, что и протокол IP.

Входными данными для утилиты ping является адрес узла, маршрут до которого подлежит трассировке. Адрес узла задается в виде IP-адреса или доменного адреса в командной строке при запуске утилиты. На основе откликов протокола ICMP утилита строит протокол трассировки соединения, из которого можно определить, через какие узлы и в течение какого времени проходили пакеты по сети до заданной адресной точки. Версия BSD утилиты ping в ОС UNIX позволяет выполнять очень широкий набор функций по протоколированию и трассировке соединений. В других ОС (например, в Windows NT) часть функций трассировки выделена в другую утилиту - traceroute (в Windows NT - tracert), а утилита ping позволяет только проверить наличие соединения.

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

Указанные сервисные утилиты выполняют в основном отладочные, а не прикладные функции. Они чаще всего используются административным персоналом сетей и узлов для проверки исправности оборудования и правильности настроек программных систем. Они также полезны разработчикам прикладных программ, ориентированных на работу в сети, для проверки отклика этих программ на входящие сообщения. Версии этих утилит во многих ОС (прежде всего - под ОС UNIX) позволяют получить дополнительную отладочную информацию, полезную разработчикам программ при отладке. Например, возможна распечатка содержимого входных и выходных пакетов, распечатка заголовков пакетов (в стандартных утилитах ping и tracert под графической оболочкой типа Windows такие отладочные функции не предоставляются).

Программирование обмена данными на основе транспортных протоколов

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

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

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

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

Программный интерфейс сокетов был разработан для ОС UNIX. Библиотека функций, поддерживающих этот интерфейс, входит в ядро всех ОС типа UNIX и Linux. Однако принципы работы с этим программным интерфейсом применимы к большинству ОС, поддерживающих TCP/IP (например, в семействе ОС и оболочек типа Windows программный интерфейс сокетов реализован в динамической библиотеке Winsock.dll).

Для протокола TCP пассивное (на стороне сервера) соединение с сокетом приводит к выполнению следующих функций:

Получив входящий запрос на соединение, сервер должен решать как бы две задачи одновременно: обслуживать уже установленное с клиентом соединение в соответствии с прикладным протоколом (принимать и отдавать данные клиенту) и ожидать поступления новых запросов на соединение от других клиентов. Обычно в развитых ОС (а сюда подпадают все современные ОС за исключением, разве что, MS DOS) эта проблема решается за счет возможностей параллельного выполнения нескольких процессов. Сервер может породить новый процесс (или новую цепочку выполнения - thread), который и должен будет заняться обслуживанием уже установленного соединения, а сам основной процесс сервера может закрыть текущее соединение и вновь вернуться к ожиданию запросов на соединение от других клиентов. В ОС типа UNIX создание нового процесса решается с помощью функции fork, при этом за вновь созданным процессом сохраняются все соединения, сделанные в основном процессе.

Для протокола TCP активное (на стороне клиента) соединение с сокетом приводит к выполнению следующих функций:

Клиент, как правило, не требует для своей работы параллельного выполнения нескольких процессов.

В среде программирования Borland Delphi существуют специальные классы, которые позволяют выполнять все те же действия, что и библиотека сокетов в ОС UNIX. Они взаимодействуют с библиотекой Winsock.dll на основе специальных технологий ОС (ActiveX технологии и COM-объекты). В среде Borland Delphi версии 3.0 для целей клиентского и серверного соединений служит класс объектов TTCP; а в среде Borland Delphi версии 5.0 для клиентского соединения существует класс объектов TClientSocket, а для серверного - TServerSocket. Естественно, пользователь может на основе базовых классов разрабатывать свои собственные классы, которые будут поддерживать соединения по определенным им самим прикладным протоколам.

Для того, чтобы создать сокет, достаточно создать экземпляр объекта выбранного класса (TTCP - в среде Borland Delphi версии 3.0 на страничке компонент "Internet", TClientSocket или TServerSocket - в среде Borland Delphi версии 5.0 также на страничке компонент " Internet"). Это можно выполнить при проектировании приложения в среде разработки или же средствами языка программирования при выполнении приложения. Чтобы специфицировать (настроить) сокет необходимо созданному экземпляру объекта присвоить нужные значения в указанные свойства (properties) - как правило, это свойства с именами вида "Port" и "Host" (имена и состав свойств зависят от версии среды разработки). Это тоже можно сделать как в режиме проектирования приложения, так и командами присвоения свойств объекта в тексте программы. После этого сокет инициализирован и с ним можно работать.

Для работы сокета клиента необходимо открыть сокет (процедура Open), затем использовать процедуры установления соединения, передачи и приема данных, а в конце работы закрыть сокет (процедура Close). При удалении экземпляра объекта автоматически прекратит существование и связанный с ним сокет.

Для работы сокета сервера после его создания надо вызвать процедуру ожидания соединения. При этом по установлению соединения наступит событие, которое программист должен соответствующим образом обработать. В среде Borland Delphi версии 3.0 программист сам должен создавать потоки выполнения для обслуживания соединения (для выполнения потоков служат экземпляры класса объектов TThread), а в среде Borland Delphi версии 5.0 это можно сделать в автоматическом или полуавтоматическом режиме. После окончательного завершения работы сокет сервера следует закрыть. При удалении экземпляра объекта автоматически прекратит существование и связанный с ним сокет.

Более подробную информацию о функциях программного интерфейса с сокетами можно получить в специальной литературе.

Порядок выполнения работы

    1. Получить вариант задания у преподавателя.
    2. Разработать прикладную программу в соответствии с заданием.
    3. Подготовить и защитить отчет.
    4. Написать и отладить программу на ЭВМ.
    5. Сдать работающую программу преподавателю.

Требования к оформлению отчета

Отчет должен содержать следующие разделы:

Основные контрольные вопросы

  1. Какую роль выполняет транспортный протокол TCP в сети Internet ? Расскажите о назначении протоколов транспортного уровня.
  2. Расскажите, как происходит передача сообщения в сети Internet по протоколу TCP.
  3. Что такое скользящее окно ? Расскажите о принципах работы протокола TCP со скользящим окном сегментов сообщения.
  4. Что такое сокет ? Какие параметры протокола TCP позволяют однозначно идентифицировать каждое соединение ?
  5. На основе каких принципов выбираются номера портов для прикладных программ в сети Internet ? Перечислите номера портов наиболее употребительных прикладных служб сети.
  6. Объясните, как соответствуют друг другу номера портов отправителя и получателя при соединении между двумя ЭВМ по протоколу TCP. Что такое мультиплексирование портов ?
  7. Расскажите о принципах работы протокола передачи сообщений UDP. В чем его отличие от протокола TCP ?
  8. Для каких целей служат утилиты ping и traceroute ? Расскажите о принципах их работы.
  9. Что такое активное и пассивное соединение. В чем их отличие ?
  10. Расскажите, какую типовую последовательность действий надо выполнить для установления пассивного соединения.
  11. Расскажите, какую типовую последовательность действий надо выполнить для установления активного соединения.
  12. Как реализованы функции работы с сокетами в библиотеке под ОС типа UNIX ?
  13. Как реализованы функции работы с сокетами в среде разработки Borland Delphi ?

ТИПОВЫЕ Варианты заданий

  1. Написать программу, которая будет доступать на произвольный сервер, устанавливать соединение по указанному преподавателем номеру порта, считывать требуемое количество символов и выводить их на экран локальной машины.
  2. Написать программу, которая будет доступать на произвольный сервер, устанавливать соединение по указанному преподавателем номеру порта, передавать на сервер произвольную строку, ждать отклик сервера и выводить его на экран локальной машины.
  3. Написать серверную программу, которая будет ожидать соединения по указанному преподавателем порту, а после установления соединения передавать клиенту строку, содержащую время дня и текущую дату.
  4. Написать серверную программу, которая будет ожидать соединения по указанному преподавателем порту, а после установления соединения передавать клиенту строку, прочитанную из произвольного файла.
  5. Написать серверную программу, которая будет ожидать соединения по указанному преподавателем порту, после установления соединения ожидать от клиента определенную строку символов, и после ее получения разрывать соединение.
  6. Написать серверную программу, которая будет ожидать соединения по указанному преподавателем порту, после установления соединения ожидать от клиента произвольную строку символов, и, получив строку, возвращать ее клиенту.

Рекомендуемая литература

    1. Паркер Т. TCP/IP. Освой самостоятельно - М.: Издательство "Бином", 1997 - 448 с.: ил.
    2. Семенов Ю.А. Протоколы и ресурсы Internet - М.: Радио и связь, 1996 - 320 с.: ил.
    3. Шапошников И.В. Интернет-программирование - СПб.: БХВ - Санкт-Петербург, 2000 - 224 с.: ил.

    1. Калверт Чарльз Delphi 4. Энциклопедия пользователя: Пер. с англ. - Киев: Издательство "ДиаСофт", 1998 - 800 с.

Лабораторная работа № 4
Разработка прикладных программ

в графической среде X Window

Цель работы: изучение основных принципов организации графической среды X Window, разработка прикладных программ, обеспечивающих интерфейс с пользователем на основе этой графической среды.

Для выполнения лабораторной работы требуется разработать программу, которая выполняется под управлением ОС типа UNIX и использует возможности интерфейса графической среды X Window.

Краткие теоретические сведения

Основные принципы построения системы X Window

X Window (или просто "X" - "экс" в английском, "икс" в русском варианте) - это система для создания графического пользовательского интерфейса на компьютерах, работающих под управлением ОС типа UNIX (или подобной ей распространенной ОС Linux). В настоящее время система X Window является практически единственным стандартом для создания графического интерфейса под ОС типа UNIX. Все современные прикладные программы, выполняющиеся под этой ОС и имеющие графический интерфейс, построены именно на основе этой системы. В последнее время удобный и наглядный графический интерфейс в "X" приобрели также многие системные приложения и утилиты ОС UNIX, что значительно облегчает работу пользователя с ними.

Система основана на использовании четырех базовых принципов:

Система X Window была разработана в Массачусетском Технологическом Институте (США). История разработки и применения системы тесно связана с развитием семейства ОС UNIX. Сейчас существует несколько версий этой системы, но все они базируются на одних и тех же базовых принципах. Кроме того, некоторые основополагающие принципы системы - такие, как оконный интерфейс и управление на основе событий - нашли применение в других графических средах, в том числе в широко известном семействе графических оболочек типа Microsoft Windows (к сожалению, их разработчик - фирма Microsoft - не посчитала нужным перенять принцип сетевой организации системы, а зря !).

Сетевая организация системы X Window.

Сетевая организация системы X Window заключается в том, что она поддерживает работу приложений как на отдельной (локальной) ЭВМ, так и в сети. Это означает, что программа, выполняющаяся на одном компьютере, может взаимодействовать с пользователем, находящемся на другой машине в сети. При этом для программы нет никакой разницы в том, взаимодействует ли она с пользователем на той же ЭВМ, где выполняется сама, либо на другой ЭВМ в сети - принцип ее взаимодействия с системой остается неизменным. Система обеспечивает вывод информации на экран ЭВМ (у которой, в принципе, может быть несколько экранов), воспринимает сигналы от внешних устройств, таких как клавиатура и мышь, и передает их тем программам, которым они адресованы. Совокупность экранов и устройств ввода называется в терминах X Window дисплеем (или X-дисплеем - X-display).

Вся система X Window представляет собой совокупность программ и библиотек. Основой ее является специальная программа - X-сервер (X-server). Это отдельный процесс, постоянно выполняющийся на компьютере, к которому подсоединен дисплей. Для того, чтобы система X Window функционировала, в ней должен существовать хотя бы один X-сервер. Реально серверов может быть несколько, и тогда программа пользователя имеет возможность выбрать для работы любой из них. Фактически, в настоящее время с каждой ОС типа UNIX или Linux поставляется один X-сервер, который обеспечивает работу системы X Window на локальной ЭВМ (когда и сервер, и прикладная программа работают на одном и том же компьютере). Любой квалифицированный пользователь, выполнив простейшие настройки системы, может добиться, чтобы тот же сервер обеспечивал работу системы X Window для нескольких ЭВМ в локальной сети.

X-сервер выполняется на компьютере, к которому подключен X-дисплей. Именно сервер знает особенности конкретной аппаратуры, знает, как отображать графические элементы на экране (или экранах). Он также умеет воспринимать сигналы от устройств ввода (клавиатуры и мыши). Прикладной программе совсем не нужно знать особенности аппаратуры - ей достаточно уметь общаться с сервером. В этом и заключается преимущество системы X Window: администратору достаточно настроить только сервер - и с ним могут работать все приложения в системе.

Обычно X-сервер - это процесс, выполняющийся под ОС типа UNIX или Linux. Однако в настоящее время существуют различные X-серверы, выполняющиеся под управлением других ОС и графических оболочек - например, Windows или Windows NT. Тогда возможно, чтобы само приложение выполнялось под управлением ОС типа UNIX, а пользователь взаимодействовал с ним, работая в среде другой ОС.

X-сервер общается с прикладными программами в системе X Window, которые часто называют X-клиентами (X-client), посылая и принимая от них пакеты данных. Обмен данными ведется по специальному протоколу - X-протоколу (X-protocol). От прикладных программ серверу идут пакеты, содержащие информацию о том, какие графические элементы следует отобразить на экране, а также сообщения для других прикладных программ. От сервера прикладным программам передаются пакеты, содержащие информацию о событиях (сообщениях), инициированных внешними устройствами или другими прикладными программами. Например, если пользователь нажимает кнопку мыши, то сервер определяет, в окне какой программы нажата кнопка, и посылает этой программе пакет с сообщением о данном событии.

X-протокол построен на основе стека Internet-протоколов TCP/IP. При работе приложения в сети пакеты с данными передаются через сеть. При этом для обмена данными используются IP адреса X-сервера и X-клиентов, поэтому даже локальная сеть должна поддерживать технологии сети Internet (Intranet) для того, чтобы обеспечивать работу системы X Window. Если приложение работает на локальной машине, то обмен данными идет через специальный Internet-адрес - адрес локального адаптера (который называется loopback или localhost adapter). Этот адаптер имеет адрес вида "127.*.*.*" - обычно это "127.0.0.1". Такой адрес специально выделен в сети Internet для пакетов, которые реально никуда не передаются, а принимаются тут же, на локальной машине, но при этом обмен данными ведется точно так же, как если бы пакеты действительно передавались по сети. Такая архитектура позволяет обеспечивать единый программный интерфейс для системы X Window вне зависимости от того, работает ли она в сети или на локальной машине. Локальный адаптер всегда устанавливается и автоматически настраивается вместе с любой ОС типа UNIX или Linux вместе со всем стеком протоколов TCP/IP.

Общая схема взаимодействия сервера и приложений клиентов в рамках системы X Window изображена на рис. 7.

Оконный интерфейс системы X Window

Система X Window позволяет пользователю работать с несколькими приложениями одновременно. Чтобы вывод нескольких программ не смешивался на экране дисплея, система создает на экране дисплея виртуальные подэкраны - окна. Каждое приложение производит вывод данных лишь в своем окне или окнах. Система X Window предоставляет набор средств для управления окнами: создание окон, их перемещение по экрану, изменение их размеров и др.

Окно - это базовое понятие в системе X Window. Оно представляет собой прямоугольную область на экране, предоставляемую системой программе-клиенту. Программа использует окно для вывода графической и текстовой информации. С каждым окном связана система координат, начало которой находится в верхнем левом углу окна. Ось X направлена вправо, а ось Y - вниз от начала координат. Оперируя координатами, приложение может управлять расположением различных объектов в своем окне.

Окно имеет внутреннюю ("клиентскую") часть и край (рамку). Основными атрибутами окна являются ширина и высота внутренней части и ширина края (рамки). Кроме внешнего оформления окна, рамка может содержать также различные органы управления, которые позволяют пользователю системы управлять окнами. За внутреннюю часть окна отвечает приложение, а за обрамление его рамкой - X-сервер. Обычно обрамлением окон на сервере занимается специальный процесс, называемый оконным менеджером (Window manager). От типа используемого оконного менеджера зависит внешний вид окон приложений на сервере. Поменяв менеджера, пользователь может поменять внешний вид окон, работая с теми же самыми приложениями. Это очень эффективное средство системы X Window, которое не всегда присутствует в других графических средах - например, среда типа Microsoft Windows практически лишена такой возможности.

Каждому приложению в системе X Window соответствует хотя бы одно окно. Приложение может создать и несколько окон. При этом все окна связываются в иерархию, в которой одни являются родителями, а другие - потомками. Приложение может устанавливать некоторые особенности в отношении своих окон "родитель-потомок". Поведение каждого окна зависит от того, какие отношения установлены между ним и его родителем. Сам X-сервер на экране всегда создает одно основное окно, которое является верхним окном в иерархии и родителем всем остальным окнам. Это окно называется корневым. Каждому приложению, в свою очередь, сервер выделяет окно, которое становится корневым в рамках этого приложения.

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

Ресурсы приложений в системе X Window

Как правило, приложения в системе X Window имеют набор конфигурационных параметров, которые не влияют на алгоритм (логику) работы приложения, но определяют внешний вид его интерфейса. Такие параметры называются в терминах X Window ресурсами.

Такими параметрами могут быть цвет окна, тип шрифта, которым выводится текстовая информация, и многое другое.

Система стандартизирует способ задания ресурсов приложений и содержит ряд процедур для работы с ними. Эта совокупность функций называется "менеджер ресурсов" (X Resource Manager). Хранилище конфигурационных параметров программы называется базой данных ресурсов программы. База данных ресурсов программы может быть организована в нескольких различных формах.

Грамотно построенное приложение в системе X Window, предоставив пользователю доступ к базе своих ресурсов, может позволять ему менять и настраивать в удобной для него форме внешний вид своего интерфейса без переработки самой программы.

Принцип организации и использования ресурсов приложений нашел свое применение и в других графических средах (например, в семействе Microsoft Windows). Однако базы ресурсов приложений в этих средах строятся на основе других технических средств, не совместимых с системой X Window.

Управление на основе событий (сообщений)

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

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

Управление на основе событий - это принципиально новая технология программирования интерактивных систем. Она нашла свое применение во многих графических средах и ОС. Далее эта технология рассматривается более подробно.

Создание простейших программ для системы X Window

Для того, чтобы программировать прикладные программы для системы X Window совсем не обязательно знать детали реализации сервера и протокола обмена данными. Система предоставляет библиотеку процедур, с помощью которых прикладные программы могут осуществлять доступ к услугам системы X Window на более высоком уровне. Так, для того, чтобы вывести точку на экран, достаточно вызвать процедуру XDrawPoint, передав ей соответствующие параметры, а она уже выполнит всю "черновую" работу по подготовке и передаче необходимых пакетов данных серверу.

Библиотека процедур называется "Xlib". Она поставляется со всеми современными версиями ОС типа UNIX или Linux (как правило, в ОС она располагается в библиотечном файле lX11.a или аналогичном ему в каталоге "/usr/lib"). Прототипы функций библиотеки, используемые ею структуры данных, типы и прочее определены в файлах, расположенных в каталоге "/usr/include/X11" (речь идет о заголовочных файлах для языков Си и Си++, для других средств разработки требуются другие описания файлов библиотеки). Следует обратить внимание, что регистр букв здесь и далее везде имеет значение, а буква "X" в ОС типа UNIX - это наиболее употребительный знак, присущий всему, что связано с системой X Window.

Привести здесь полное описание библиотеки "Xlib" не представляется возможным, поскольку она содержит огромное количество процедур, функций и структур данных. Для знакомства с ней следует обратиться к рекомендуемой литературе, либо к техническому описанию системы X Window - как правило, в любую поставку ОС типа UNIX или Linux входит также и полное техническое описание данной библиотеки и целого ряда других. Далее будут рассмотрены только общие принципы программирования приложений, выполняющихся в системе X Window.

Каждую программу, которая работает в системе можно X Window условно разбить на три основных составляющих: подготовительную часть, которая отвечает за установление связи с сервером и подготовку начальных данных; основную часть, которая содержит цикл обработки сообщений; и функции, отвечающие за реакцию программы на различные события в системе. Более сложные программы могут содержать дополнительные модули, такие, как функция реакции на таймер или на отсутствие действий пользователя в системе, но здесь эти функции не рассматриваются. Подготовительная часть программы и цикл обработки сообщений имеют типовой вид для всех программ и отличаются в основном только параметрами вызываемых функций. Реакция программы на различные события (сообщения) - это и есть ее основное содержание в системе X Window, именно эту часть в первую очередь проектирует разработчик.

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

Любая программа, работающая в системе X Window, начинается с того, что устанавливает связь с X сервером. В библиотеке Xlib этой цели служит функция XOpenDisplay. Ее аргумент определяет сервер, с которым надо установить связь, если аргумент не задан (имеет значение NULL), то адрес сервера определяется окружением ОС, в котором запущена прикладная программа (этой цели служит переменная окружения DISPLAY и обычно она задает локальный X сервер). Адрес сервера имеет вид "host:server.screen", где host - имя компьютера, на котором запущен X сервер (обычно это имя "localhost"), server - номер сервера (на одном компьютере может быть запущено одновременно несколько X серверов), а screen - номер экрана (один сервер может управлять несколькими экранами). Два последних параметра чаще всего имеют значение "0", поэтому адрес сервера по умолчанию, как правило, имеет вид "localhost:0.0". Номер экрана в адресе указывать необязательно, система может выбрать его сама.

После того, как связь с сервером установлена, программа должна определить номер экрана по умолчанию - для этого служит функция DefaultScreen. Затем нужно создать окно и показать его на дисплее. Для создания окна можно использовать одну из двух функций: XCreateWindow или XCreateSimpleWindow. Вторая из них проще в использовании, имеет меньше параметров, но и предоставляет разработчику меньше возможностей. После того, как окно создано, менеджеру окон надо дать рекомендации о том, как его отображать (функция SetWindowManagerHints), а серверу - установить, какие события будет обрабатывать прикладная программа (функция XSelectInput). Теперь окно можно выводить на экран. Чтобы отобразить окно на экране, используется функция XMapWindow. На этом подготовительная часть программы заканчивается.

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

Для получения у системы очередного события в библиотеки Xlib служит функция XNextEvent. Она помещает всю информацию о наступившем событии в структуру типа XEvent. Затем разработчик программы может воспользоваться этой информацией и прежде всего, определить тип наступившего события - для этого служит поле структуры XEvent.type. В общем виде цикл обработки событий (сообщений) на основе библиотеки Xlib в прикладной программе для X Window на языке "Си" имеет примерно следующий вид:

… … …

Display* ptDisplay;

XEvent ptEvent;

… … …

while (1)

{

XNextEvent(ptDisplay,&ptEvent);

switch (ptEvent.type)

{

case …

… … …

case …

… … …

} /* end switch */

}/* end while */

… … …

Программа в системе X Window завершается по выбранному разработчиком событию обычным образом, как и любая другая программа (в языке "Си" для этого достаточно вызвать функцию exit). Для корректного завершения работы программы с X сервером (разрыва соединения) в библиотеке Xlib нужно вызвать функцию XСloseDisplay.

Программирование с управлением по сообщениям (событиям)

Программирование с управлением по сообщениям (событиям) - это новая технология программирования, вошедшая в употребление с появлением таких систем, как X Window (сейчас уже сложно сказать, кто конкретно является родоначальником данной технологии). Со временем она вышла за рамки узкого применения, и была положена в основу многих других систем с графическим оконным интерфейсом, в т.ч. и в основу такой широко распространенной для персональных ЭВМ среды, как Microsoft Windows. В настоящее время практически все многооконные системы базируются на этой технологии (сам термин "сообщение" - "message" - привнесен в эту технологию уже из среды MS Windows, в X Window более употребителен термин "событие" - "event").

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

То, что в прикладной программе для X Window не функции управляют данными, а наоборот - поступающие данные управляют поведением программы, принципиально отличает ее от традиционных программ с "линейным" программированием. Программа в X Window работает совсем не так, как привыкли разработчики стандартных программ, например, в ОС MS DOS или программ с текстовой командной строкой в ОС типа UNIX. Если говорить о таких примитивных системах, как MS DOS, то прикладная программа в X Window в чем-то сродни схеме обработки прерываний в них, хотя, конечно, имеет совсем другую суть.

События в системе X Window могут зависеть друг от друга и наступать одно за другим -и тогда их обработка будет идти последовательно; а могут быть не зависимы - и тогда нельзя четко сказать, в какой последовательности они будут обработаны. В этом смысле программирование с управлением по событиям имеет много общего с программированием параллельных взаимодействующих процессов, с той лишь разницей, что обработка событий всегда происходит в рамках одного процесса (с точки зрения ОС) и потому никогда два или более событий не могут обрабатываться одновременно. В этом смысле программирование с управлением по событиям проще, оно как бы занимает промежуточную ступень между разработкой последовательных, "линейных" программ и параллельным программированием.

В цикле обработке сообщений, построенном выше на основе библиотеки Xlib, ключевую роль играет вызов функции XNextEvent. Именно эта функция выбирает из потока поступающих данных программы очередное событие. Тип события определяет, по какому пути пойдет дальше работа программы - где и как это событие будет обработано (в примере этому служит простейший оператор switch-case, но в реальной программе все может быть куда сложнее). Поскольку последовательность типов наступающих событий не известна заранее, то и последовательность выполнения операторов программы заранее не определена - в примере нельзя точно сказать, как и в какой последовательности будут выполнены секции case оператора switch внутри бесконечного цикла.

Более того, функция XNextEvent обращается к системе за очередным событием, но в потоке входящих данных на этот момент может и не быть новых событий. Тогда прикладной программе, по сути, нечего делать, и ее выполнение будет приостановлено до того, как наступит очередное событие. Чтобы не терять зря драгоценное процессорное время система может передать управление другой программе, у которой в потоке данных уже есть события. Таким образом, если поток входящих данных не слишком насыщен событиями (а это является скорее правилом, чем исключением для большинства прикладных многооконных программ), то большую часть времени управление будет находится "в руках" ОС, которая время от времени будет обращаться к прикладной программе только затем, чтобы она обработала очередное событие.

Этот порядок работы - устоявшаяся практика для прикладных программ с графическим интерфейсом, поскольку реакция даже самого "шустрого" пользователя значительно уступает скорости, с которой программы обрабатывают события. Такая последовательность может быть нарушена только в том случае, если по наступлению какого-то события программе потребуется значительное время - например, на обработку массива данных или передачу пакетов по сети. Тогда следующая функция получения события XNextEvent будет вызвана не сразу и до тех пор ОС не получит управления. Во многих ОС длительное отсутствие реакции прикладной программы на события будет воспринято как "зависание" программы - и тогда разработчик должен позаботится о том, чтобы функция обработки событий была своевременно вызвана (механизмы, используемые для этого, здесь не рассматриваются).

Механизм, который позволяет прикладной программе передавать управление ОС до наступления очередного события, называется механизмом "непринудительной многозадачности" (nonpreemptive multitasking). Термин "непринудительной" связан с тем, что прикладная программа сама проявляет инициативу и передает управление системе при выборке очередного сообщения, а до тех пор управление будет находится под контролем этой программы и не может быть отнято у нее ОС "принудительно". Этим он отличается от истинного механизма многозадачности - "принудительной многозадачности" (preemptive multitasking) - который реализован в большинстве современных ОС и обеспечивает работу истинно параллельных процессов. В системе X Window механизм "непринудительной многозадачности" является мощным средством, поскольку сочетается с многозадачностью ОС UNIX или Linux. В среде MS Windows 3.1 и более ранних версий он является единственным средством параллельного выполнения программ (им также рекомендуется пользоваться в среде MS Windows 95/98, поскольку эти системы не полностью обеспечивают "принудительную многозадачность").

Те же самые методы, что были рассмотрены выше, лежат и в основе других библиотек, рассчитанных на написание программ в среде X Window (среди них далее будут рассмотрены библиотеки "Xt" и "Xm"). Более того, на основе этих же методов строятся прикладные программы в других графических средах - таких, как OS/2, MS Windows всех модификаций или MacOS (фирма Macintosh). Поэтому, освоив программирование с управлением по событиям в среде X Window, можно легко перейти к созданию программ, например, для Microsoft Windows (к сожалению, функции Windows API - Application Program Interface - которые играют в среде MS Windows ту же роль, что Xlib в среде X Window, продуманы с точки зрения разработчика куда хуже, потому слово "легко" все же надо взять в кавычки). Надо сказать, что именно развитие этой технологии, где данные управляют поведением программы, предопределило бурный расцвет другой технологии программирования - объектно-ориентированного программирования (ООП), которая также позволяет связать воедино данные и методы их обработки. Современные средства разработки предоставляют создателю программ инструментарии, построенные на основе обеих этих технологий - управления по событиям (сообщениям) и ООП.

Библиотеки для разработки прикладных программ в X Window

Библиотека Xlib предоставляет разработчику все средства, необходимые для создания прикладных программ в среде X Window. Однако как было сказано выше, значительную часть в программе занимает код, ответственный за обработку типовых событий, возникающих в процессе функционирования программы. Поэтому даже создание простейшей программы, единственной задачей которой будет отображение на экране горячо любимой всеми разработчика строчки "Hello world" - это довольно трудоемкий процесс. Конечно, поскольку система X Window получила широкое распространение и стала стандартной графической средой в ОС типа UNIX, средства разработки программ для нее не ограничиваются только библиотекой Xlib.

В настоящее время существует огромная масса различных библиотек для разработчиков программ в среде X Window. Одни из них стали стандартами "де факто" прочно заняли свое место в ОС типа UNIX или Linux и даже включены в стандарт поставки этих ОС, другие носят узко специализированный характер и поставляются сторонними производителями (либо же свободно распространяются среди разработчиков). Но все они служат двум основным целям: во-первых, стремятся максимально избавить разработчика от необходимости многократно повторять типовой код в подготовительной части программы и в цикле обработки событий, перекладывая решение этих рутинных задач на свои функции; во-вторых, предоставляют разработчикам широкий набор средств создания типовых окон и органов управления. Ведь с точки зрения системы X Window все кнопки, меню, списки, текст и другая информация на экране - это такие же окна, как и собственно окно программы. Если бы разработчик пользовался только средствами Xlib, то ему пришлось бы затратить значительную часть времени на непроизводительные расходы по созданию и отображению этих типовых окон. Библиотеки позволяют автоматизировать, ускорить и значительно упростить этот процесс.

Все библиотеки для разработчиков программ в X Window так или иначе базируются на Xlib. В любом случае их функции обращаются к средствам Xlib для отображения информации и обработки событий. Это важное свойство - оно обеспечивает переносимость как самих библиотек, так и построенных на их основе прикладных программ. Любая программа, рассчитанная на работу в среде X Window, будет выполняться под управлением любой ОС, где бы эта среда ни была установлена, и единственным условием ее выполнения будет наличие X сервера и средств поддержки соответствующих библиотек. Далее будут рассмотрены две типовые библиотеки средств разработки - "Xt" (X Toolkit Intrinsics) и "Xm" (OSF/Motif). Они получили широкое распространение, в настоящее время являются стандартными средствами разработки и входят в поставку любой ОС типа UNIX или Linux. Еще одним средством разработки, претендовавшим на роль стандарта, была библиотека "Open Look", но она не получила в настоящее время широкого распространения.

Библиотека "Xt" (X Toolkit Intrinsics) содержит средства, которые значительно упрощают инициализацию программ, обработку событий и создание окон. Эта библиотека позволяет избавить программиста от большой части рутинной работы, связанной с созданием прикладных программ в среде X Window. Кроме того, в состав библиотеки входит набор простейших стандартных средств и органов управления - кнопок, меню, списков и др. В современных системах эти примитивные органы управления реально не используются, но на их основе построена масса других библиотек. В терминах этой библиотеки орган управления (кнопка, пункт меню и т.п.) в зависимости от своих свойств носит название widget или gadget (русские названия для этих терминов отсутствуют). Эти термины получили широко распространение и приняты во многих других библиотеках, многие из которых использую средства "Xt".

Библиотека "Xm" (OSF/Motif - Open Software Foundation Motif) представляет собой пакет, который содержит менеджер окон, набор утилит для выполнения различных вспомогательных операций в среде X Window, а также библиотеку объектов и органов управления программ, построенных на основе X Toolkit Intrinsics. Именно менеджер окон, входящий в состав этого пакета, придает окнам среды X Window вид, к которому привыкли многие пользователи системы (он во многом напоминает вид окон среды MS Windows в отличие, например, от менеджера окон "Open Look"). Органы управления в составе OSF/Motif содержат хорошо знакомые всем пользователям кнопки, меню, списки и другие экранные элементы. Среди утилит библиотеки можно выделить средства, которые позволяют разработчику создавать и редактировать базы ресурсов прикладных программ.

На основе библиотеки "Xm" создано множество прикладных программ, кроме того, ее органы управления получили развитие во многих других, более современных библиотеках.

Конечно, средства разработки программ в среде X Window далеко не ограничиваются рассмотренными выше библиотеками, да и сами эти библиотеки рассмотрены здесь только в самых общих чертах (для более детального знакомства с ними следует обратиться к литературе и техническому описанию ОС). Но в современных ОС типа UNIX или Linux среда X Window стала стандартом для разработки графических программ, поэтому важной задачей является изучение основных принципов построения этой системы.

Порядок выполнения работы

    1. Получить вариант задания у преподавателя.
    2. Изучить основные принципы разработки прикладных программ в среде X Window.
    3. Разработать прикладную программу для среды X Window в соответствии с заданием.
    4. Подготовить и защитить отчет.
    5. Написать и отладить программу на ЭВМ.
    6. Сдать работающую программу преподавателю.

Требования к оформлению отчета

Отчет должен содержать следующие разделы:

Основные контрольные вопросы

  1. Что такое система X Window ? Расскажите, для чего она предназначена и на основе каких принципов построена.
  2. В чем заключается принцип сетевой организации системы X Window ? Какие преимущества предоставляет он прикладным программам ?
  3. Что такое X-сервер ? Расскажите, какие функции он выполняет.
  4. Как осуществляется в графической системе X Window взаимодействие прикладной программы с X-сервером ?
  5. В чем особенность взаимодействия прикладной программы с X-сервером на локальной ЭВМ ? Расскажите, для каких целей используется "локальный адаптер" в системе X Window.
  6. Что такое окно с точки зрения системы X Window ? Какие параметры характеризуют окно ? Какую роль выполняет многооконный интерфейс в системе ?
  7. На основе каких принципов организуется иерархия окон в системе X Window? Расскажите о том, какие функции выполняет в системе менеджер окон.
  8. Что такое "ресурс приложения" в системе X Window ? Расскажите о том, какую роль играет БД ресурсов приложения в системе.
  9. В чем общие черты и в чем различия графических сред Microsoft Windows и X Window ?
  10. Расскажите о роли библиотеке "Xlib" в разработке программ X Window. Какие действия должна выполнить простейшая прикладная программа ?
  11. В чем заключается суть технологии программирования с управлением по событиям ? Опишите основные принципы этой технологии.
  12. Какие функции обеспечивают обработку событий (сообщений) в библиотеке Xlib ? Объясните работу типового цикла обработки сообщений.
  13. Что такое "механизм непринудительной многозадачности" ? Чем он отличается от истинной многозадачности, в чем его недостатки ?
  14. Расскажите, для чего предназначены прикладные библиотеки "Xt" (X Toolkit Intrinsics) и "Xm" (OSF/Motif).

Типовые Варианты заданий

Вариант задания для лабораторной работы выбирается по согласованию с преподавателем из вариантов заданий для лабораторных работ №2 или №3. Прикладная программа по выбранному варианту должна быть разработана для среды X Window под ОС типа UNIX или Linux. Допускается использовать любые библиотеки, совместимые с выбранной ОС, и любой язык программирования по согласованию с преподавателем (рекомендуются языки "Си" или "Си++" и библиотека OSF/Motif).

Рекомендуемая литература

    1. Unix, X Window, Motif. Основы программирования. /Под ред. Рябова А.Ю. - М.: АО "Аналитик", 1994 - ч. 1,2 - 251 с.
    2. X Toolkit Intrinsics Reference Manual - O'Reilly & Associates, USA, 1992 - p.650.
    3. Керниган Б., Пайк Р. UNIX - универсальная среда программирования - М.: Финансы и статистика, 1992 - 320 с.
    4. Браун С. Операционная система UNIX - М.: Мир, 1986 - 463 с.