Как это работает?
Как это работает?
По существу, собственно система RPC является встроенной в программу- клиент и программу-сервер. Отрадно, что при разработке распределенных приложений, не придется вникать в подробности протокола RPC или программировать обработку сообщений. Система предполагает существование соответствующей среды разработки, которая значительно облегчает жизнь создателям прикладного программного обеспечения. Одним из ключевых моментов в RPC является то, что разработка распределенного приложения начинается с определения интерфейса объекта — формального описания функций сервера, сделанного на специальном языке. На основании этого интерфейса затем автоматически создаются заглушки клиента и сервера. Единственное, что необходимо сделать после этого, — написать фактический код процедуры.
В качестве примера рассмотрим RPC фирмы Sun Microsystems.
Система состоит из трех основных частей:
? rpcgen(1) — RPC-компилятор, который на основании описания интерфейса удаленной процедуры генерирует заглушки клиента и сервера в виде программ на языке С.
? Библиотека XDR (eXternal Data Representation), которая содержит функции для преобразования различных типов данных в машинно- независимый вид, позволяющий производить обмен информацией между разнородными системами.
? Библиотека модулей, обеспечивающих работу системы в целом.
Рассмотрим пример простейшего распределенного приложения для ведения журнала событий. Клиент при запуске вызывает удаленную процедуру записи сообщения в файл журнала удаленного компьютера.
Для этого придется создать как минимум три файла: спецификацию интерфейсов удаленных процедур log.x (на языке описания интерфейса), собственно текст удаленных процедур log.c и текст головной программы клиента main() — client.c (на языке С) .
Компилятор rcpgen(1) на основании спецификации log.x создает три файла: текст заглушек клиента и сервера на языке С (log_clnt.c и log_svc.с) и файл описаний log.h, используемый обеими заглушками.
Итак, рассмотрим исходные тексты программ.
log.x
В этом файле указываются регистрационные параметры удаленной процедуры — номера программы, версии и процедуры, а также определяется интерфейс вызова — входные аргументы и возвращаемые значения. Таким образом, определена процедура RLOG, в качестве аргумента принимающая строку (которая будет записана в журнал), а возвращаемое значение стандартно указывает на успешное или неудачное выполнение заказанной операции.
program LOG_PROG {
version LOG_VER {
int RLOG(string) = 1;
} = 1;
} = 0x31234567;
Компилятор rpcgen(1) создает файл заголовков log.h, где, в частности, определены процедуры:
log.h
/*
* Please do not edit this file.
* It was generated using rpcgen.
*/
#ifndef _LOG_H_RPCGEN
#define _LOGH_H_RPCGEN
#include <rpc/rpc.h>
/* Номер программы */
#define LOG_PROG ((unsigned long)(0x31234567))
#define LOG_VER ((unsigned long)(1)) /* Номер версии */
#define RLOG ((unsigned long)(1)) /* Номер процедуры */
extern int *rlog_1();
/* Внутренняя процедура - нам ее использовать не придется */
extern int log_prog_1_freeresult();
#endif /* !_LOG_H_RPCGEN */
Рассмотрим этот файл внимательно. Компилятор транслирует имя RLOG, определенное в файле описания интерфейса, в rlog_1, заменяя прописные символы на строчные и добавляя номер версии программы с подчеркиванием. Тип возвращаемого значения изменился с int на int*. Таково правило — RPC позволяет передавать и получать только адреса объявленных при описании интерфейса параметров. Это же правило касается и передаваемой в качестве аргумента строки. Хотя из файла print.h это не следует, на самом деле в качестве аргумента функции rlog_1() также передается адрес строки.
Помимо файла заголовков компилятор rpcgen(1) создает модули заглушки клиента и заглушки сервера. По существу, в тексте этих файлов заключен весь код удаленного вызова.
Заглушка сервера является головной программой, обрабатывающей все сетевое взаимодействие с клиентом (точнее, с его заглушкой). Для выполнения операции заглушка сервера производит локальный вызов функции, текст которой необходимо написать:
log.с
#include <rpc/rpc.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "log.h"
int* rlog_1(char** arg) {
/* Возвращаемое значение должно определяться как static */
static int result;
int fd; /* Файловый дескриптор журнала */
int len;
result = 1;
/* Откроем файл журнала (создадим, если он не существует),
в случае неудачи вернем код ошибки result == 1. */
if ((fd = open("./server.log",
O_CREAT | O_RDWR | O_APPEND)) < 0)
return(&result);
len = strlen(*arg);
if (write(fd, arg, strlen(arg) != len)
result = 1;
else
result = 0;
close(fd);
return(&result); /* Возвращаем результат — адрес result */
}
Заглушка клиента принимает аргумент, передаваемый удаленной процедуре, делает необходимые преобразования, формирует запрос на сервер portmap(1M), обменивается данными с сервером удаленной процедуры и, наконец, передает возвращаемое значение клиенту. Для клиента вызов удаленной процедуры сводится к вызову заглушки и ничем не отличается от обычного локального вызова.
client.c
#include <rpc/rpc.h>
#include "log.h"
main(int argc, char* argv[]) {
CLIENT *cl;
char *server, *mystring, *clnttime;
time_t bintime;
int* result;
if (argc != 2) {
fprintf(stderr, "Формат вызова: %s Адрес_хоста ", argv[0]);
exit(1);
}
server = argv[1];
/* Получим дескриптор клиента. В случае неудачи — сообщим
о невозможности установления связи с сервером */
if ((cl =
clnt_create(server, LOG_PROG, LOG_VER, "udp")) == NULL) {
clnt_pcreateerror(server);
exit(2);
}
/* Выделим буфер для строки */
mystring = (char*)malloc(100);
/* Определим время события */
bintime = time((time_t*)NULL);
clnttime = ctime(&bintime);
sprintf(mystring, "%s - Клиент запущен", clntime);
/* Передадим сообщение для журнала — время начала
работы клиента. В случае неудачи — сообщим об ошибке */
if ((result = rlog_1(&mystring, cl)) == NULL) {
fprintf(stderr, "error2 ");
clnt_perror(cl, server);
exit(3);
}
/* В случае неудачи на удаленном компьютере сообщим об ошибке */
if (*result != 0)
fprintf(stderr, "Ошибка записи в журнал ");
/* Освободим дескриптор */
clnt_destroy(cl);
exit(0);
}
Заглушка клиента log_clnt.с компилируется с модулем client.с для получения исполняемой программы клиента.
cc -o rlog client.c log_clnt.c -lns1
Заглушка сервера log_svc.с и процедура log.c компилируются для получения исполняемой программы сервера.
cc -o logger log_svc.c log.c -lns1
Теперь на некотором хосте server.nowhere.ru необходимо запустить серверный процесс:
$ logger
После чего при запуске клиента rlog на другой машине сервер добавит соответствующую запись в файл журнала.
Схема работы RPC в этом случае приведена на рис. 6.20. Модули взаимодействуют следующим образом:
1. Когда запускается серверный процесс, он создает сокет UDP и связывает любой локальный порт с этим сокетом. Далее сервер вызывает библиотечную функцию svc_register(3N) для регистрации номеров программы и ее версии. Для этого функция обращается к процессу portmap(1M) и передает требуемые значения. Сервер portmap(1M) обычно запускается при инициализации системы и связывается с некоторым общеизвестным портом. Теперь portmap(3N) знает номер порта для нашей программы и версии. Сервер же ожидает получения запроса. Заметим, что все описанные действия производятся заглушкой сервера, созданной компилятором rpcgen(1M).
2. Когда запускается программа rlog, первое, что она делает, — вызывает библиотечную функцию clnt_create(3N), указывая ей адрес удаленной системы, номера программы и версии, а также транспортный протокол. Функция направляет запрос к серверу portmap(1M) удаленной системы server.nowhere.ru и получает номер удаленного порта для сервера журнала.
3. Клиент вызывает процедуру rlog_1(), определенную в заглушке клиента, и передает управление заглушке. Та, в свою очередь, формирует запрос (преобразуя аргументы в формат XDR) в виде пакета UDP и направляет его на удаленный порт, полученный от сервера portmap(1M). Затем она некоторое время ожидает отклика и в случае неполучения повторно отправляет запрос. При благоприятных обстоятельствах запрос принимается сервером logger (модулем заглушки сервера). Заглушка определяет, какая именно функция была вызвана (по номеру процедуры), и вызывает функцию rlog_1() модуля log.c. После возврата управления обратно в заглушку преобразует возвращенное функцией rlog_1() значение в формат XDR, и формирует отклик также в виде пакета UDP. После получения отклика заглушка клиента извлекает возвращенное значение, преобразует его и возвращает в головную программу клиента.
Рис. 6.20. Работа системы RPC
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Как это работает?
Как это работает? В протоколе HTTP версии 1.1, внедренном в 1999 году и используемом по сей день во Всемирной паутине, появилась возможность в рамках одного TCP-соединения делать несколько запросов веб-серверу.Учитывая, что страницы современных сайтов обычно содержат большое
Как все это работает ?
Как все это работает ? Большую часть времени станция обычно находится в состоянии ожидания звонка или события. События определяются конфигурацией событий мейлера. Если пришло время очередного события, мейлер запускает определенные оператором процессы (например,
Как все это работает
Как все это работает В этом разделе мы продолжим разговор о вводе-выводе на примере шины SPD. Мы рассмотрим подробности низкоуровневых операций, выполняемых ниже IPCF и очень специфичных для структуры шины SPD, используемой как в старых, так и в новых моделях AS/400. Чтобы
Как это работает?
Как это работает? По существу, собственно система RPC является встроенной в программу- клиент и программу-сервер. Отрадно, что при разработке распределенных приложений, не придется вникать в подробности протокола RPC или программировать обработку сообщений. Система
Интернет: как все это работает
Интернет: как все это работает Давайте еще раз посмотрим на Web-сайт — справочник по библиотеке Ext Core. И зададимся вопросом, вынесенным в заголовок данного раздела.Как все это работает? Откуда Web-обозреватель получает нужную Web-страницу? Кто отвечает за работу сложного
2.3.3. Как это все работает?
2.3.3. Как это все работает? ОСНОВЫ ФУНКЦИОНИРОВАНИЯ ПОИСКОВЫХ СИСТЕМ, ИНДЕКСАЦИИ И РАНЖИРОВАНИЯ САЙТОВСразу хочется оговориться: поисковая система – это робот, который автоматически обрабатывает миллиарды страниц по какому-то алгоритму, в результате показывая в доли
Как это работает
Как это работает Принцип работы программы Skype (рис. 5.10) очень прост. Скачав с сайта http://www.skype.com приложение и установив его у себя на компьютере, практически можно начинать общение. Рис. 5.10. Окно программы SkypeВо многом работа в Skype похожа на работу с программами-клиентами
24.2.1. Сеть не работает
24.2.1. Сеть не работает Причиной отказа сети могут быть физическими или программными. Физические связаны с неработающим сетевым оборудованием или повреждением среды передачи данных. Программные — с неправильной настройкой сетевого интерфейса. Как правило, избавиться от
Как PGP работает.
Как PGP работает. Это поможет вам, если вы уже были знакомы с концепцией криптографии вообще, и криптографии с открытым ключом в частности. Тем не менее, есть небольшое количество вводных замечаний относительно криптографии с открытым ключом.Сначала немного терминологии.
Как работает тачпад?
Как работает тачпад? Тачпад в ноутбуке заменяет мышь. Поэтому дальше мы будем говорить, как принято: «перетащите мышью» или «щелкните кнопкой мыши».Водя пальцем по поверхности тачпада, вы перемещаете указатель по экрану нетбука. Кнопки в нижней части тачпада
Как работает видеосвязь?
Как работает видеосвязь? Чтобы вызвать собеседника на сеанс видеосвязи, в списке контактов щелкните на значке контакта правой кнопкой мыши.В контекстном меню выберите команду Запуск|Видеовызов (1). Откроется окно видеосвязи (2). В нем вы видите изображение собеседника
И всё равно это не работает
И всё равно это не работает Смертная казнь за копирование15 января в 19:09. Копирайт: Peer-to-Peer* автор фото: Андрей Бутко, по лицензии Creative Commons Attribution-Share Alike 3.0 Unported.В наше время во всём мире наказания за нарушение копирайта довольно жестокие. Астрономические цифры штрафов и
6. Как работает кортекс
6. Как работает кортекс Попытки понять, как работает мозг, подобны решению гигантской головоломки из кусочков картинки. Вы можете подходить к ее решению двумя способами. Используя подход «сверху вниз», вы начинаете с того, что берете цельную картинку, и, пользуясь ей,
Глава 11. Как это работает?
Глава 11. Как это работает? Методики поддерживают друг друга. Слабость одной из них покрывается за счет силы других.Подождите-ка минутку! Ни одна из перечисленных ранее методик не является уникальной или оригинальной. Все они используются уже давно, с самого начала эпохи
Робачевский Андрей М.
Просмотр ограничен
Смотрите доступные для ознакомления главы 👉