Определение протокола с использованием структур данных и процедур

Опубликовано в Технологии > Серверные технологии Продолжение

Для определения протокола с использованием технологии RPC необходимо выполнить следующее:

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

С теоретической точки зрения, в протоколе, который определен с использованием технологии RPC, сервер должен представлять собой отдельную удаленную программу. Запрос на выполнение операции, передаваемый клиентом серверу, соответствует дистанционному вызову процедуры, а сообщение, возвращаемое сервером клиенту, соответствует возврату управления из процедуры. Поэтому в любом протоколе, который определен с использованием технологии RPC, клиент должен быть инициатором всех операций, а сервер может только отвечать на отдельные запросы клиента. Автосалон Chevrolet официальный дилер Шевроле в Москве, постоянные акции и скидки.

В случае применения NFS требование, чтобы инициатором каждой операции выступал клиент, действительно имеет смысл, поскольку протокол доступа к файлам может быть спроектирован как действующий под управлением клиентской программы. Сервер предоставляет процедуры, позволяющие клиенту создавать или удалять файлы, каталоги и символические ссылки; выполнять чтение или запись данных; проводить поиск в каталоге указанного файла; получать информацию о состоянии всей удаленной файловой системы или отдельного файла и каталога. Хотя другие прикладные протоколы не могут быть описаны с помощью спецификации RPC так же полно, как протокол NFS, опыт показывает, что большинство вариантов взаимодействия типа клиент/сервер может быть представлено на основе принципов дистанционного вызова процедур.

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

Объявления констант, типов и данных NFS

Стандарт протокола NFS определяет имена констант, типов, а также структуры данных, применяемые во всех объявлениях процедур. Во всех объявлениях используется синтаксис объявлений RPC.

Константы NFS

Спецификация NFS определяет основные константы, в которых заданы значения, применяемые в протоколе. Эти объявления представлены на языке RPC. Например, ниже показано объявление символической константы FSF3_SYMLINK со значением 2:

const FSF3J3YMLINK = 0x0002;

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

enum nfsstat3 {
NFS3_0K =0	/* Успешный вызов */
NFS3ERR_PERM =1,	/* Пользователь не является владельцем файла */
/* или возникла другая ошибка */
NFS3ERR_N0ENT =2,	/* Файл не существует */
NFS3ERR_I0 =5,	/* Ошибка устройства ввода/вывода */
NFS3ERR~NXI0 =6,	/* Устройство или адрес не существует */
NFS3ERR~ACCES =13,	/* Доступ запрещен */
NFS3ERR~EXIST =17,	/* Указанный файл уже существует */
NFS3ERRJCDEV =18,	/* Попытка создать жесткую ссылку на */
"	/* другое устройство */
NFS3ERR_N0DEV =19,	/* Указанное устройство не существует */
NFS3ERR~N0TDIR =20,	/* Указанный элемент не является каталогом */
NFS3ERR~ISDIR =21,	У* Указанный элемент является каталогом */
NFS3ERR~INVAL = 22,	/* Недопустимый параметр */
NFS3ERR~FBIG =27,	/* Файл слишком велик для сервера */
NFS3ERR~N0SPC =28,	/* На устройстве (диске) отсутствует */
/* свободное место */
NFS3ERR_R0FS =30,	/* Запись в файловой системе, допускающей */
/* только чтение */
NFS3ERR_MLINK =31,	/* Слишком много жестких ссылок */
NFS3ERR~NAMETOOLONG = 63,      /* Файл имел слишком длинное имя */
NFS3ERR~NOTEMPTY = 66,	/* Каталог не пуст */
NFS3ERR~DQU0T= 69,	/* Превышена квота дискового пространства */
NFS3ERRJ3TALE =70,	/* Устаревший дескриптор файла */
NFS3ERR_REMOTE =71,	/* Слишком много компонентов в составном */
/* имени удаленного файла */ NFS 3ERR_BADHANDLE = 10001,    /* Поврежденный/недопустимый дескриптор файла */ NFS 3ERR~NOT_SYNC = 10002,      /* Нарушение синхронизации, установленной */
/* функцией setattr */ NFS3ERR_BAD_COOKIE = 10003,   /* Устаревший магический ключ */ NFS3ERR~N0TSUPP = 10004,       /* Операция не поддерживается */
 
NFS3ERRJT00SMALL = 10005,      /* Буфер или запрос слишком мал */ NFS3ERR~SERVERFAULT = 10006, /* Ошибка сервера, отличная от */
/* перечисленных выше */ NFS3ERR_BADTYPE = 10007,       /* Требуемый тип не поддерживается */ NFS3ERR_JUKEBOX = 10008        /* Клиент должен повторно выдать запрос */
>?

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