Головна

Механізм виклику віддалених процедур - RPC | Принципи побудови протоколу. | Програмний інтерфейс високого рівня. | передача параметрів | семантика виклику |

Як це працює?

  1. Що таке карма? Як вона працює? Багато говорили нам, що ми розплачуємося в цьому житті за те, що зробили в минулому.

По суті, власне система RPC є вбудованої в програму-клієнт і програму-сервер. Відрадно, що при розробці розподілених додатків, не доведеться вникати в подробиці протоколу RPC або програмувати обробку повідомлень. Система передбачає існування відповідного середовища розробки, яка значно полегшує життя творцям прикладного програмного забезпечення. Одним з ключових моментів в RPC є те, що розробка розподіленого додатка починається з визначення інтерфейсу об'єкта - формального опису функцій сервера, зробленого на спеціальній мові. На підставі цього інтерфейсу потім автоматично створюються заглушки клієнта і сервера. Єдине, що необхідно зробити після цього, - написати фактичний код процедури.

Як приклад розглянемо RPC фірми Sun Microsystems. Система складається з трьох основних частин:

- Rpcgen (1) - RPC-компілятор, який на підставі опису інтерфейсу віддаленої процедури генерує заглушки клієнта і сервера у вигляді програм на мові С.

- Бібліотека XDR (eXternal Data Representation), яка містить функції для перетворення різних типів даних в машинно-незалежний вигляд, що дозволяє проводити обмін інформацією між різнорідними системами.

- Бібліотека модулів, що забезпечують роботу системи в цілому.

Розглянемо приклад найпростішого розподіленого додатка для ведення журналу подій. Клієнт при запуску викликає віддалену процедуру запису повідомлення в файл журналу віддаленого комп'ютера.

Для цього доведеться створити як мінімум три файли: специфікацію інтерфейсів віддалених процедур log.x (на мові опису інтерфейсу), власне текст віддалених процедур log.c і текст головний програми клієнта main () - client.c (на мові С).

Компілятор rpcgen (l) на підставі специфікації log.x створює три файли: текст заглушок клієнта і сервера на мові С (log clnt.c і log svc.c) і файл описів log.h, використовуваний обома заглушками.

Отже, розглянемо вихідні тексти програм.

Log.x

У цьому файлі вказуються реєстраційні установки для віддаленої процедури - номера програми, версії і процедури, а також визначається інтерфейс виклику - вхідні аргументи і повертаються значення. Таким чином, визначено процедуру RLOG, як аргумент приймає рядок (яка буде записана в журнал), а повертається значення стандартно вказує на успішне або невдале виконання замовленої операції.

program LOG_PROG {

version LOG_VER {

int RLOG (string) = 1;

} = 1;

} = 0х31234567;

Компілятор rpcgen (l) створює файл заголовків log.h, де, зокрема, визначено процедури:

Log.h

/ *

* Please do not edit this file.

* It was generated using rpcgen.

* /

#ifndef _LOG_H_RPCGEN

#define _LOG_H_RPCGEN

#include

/ * Номер програми * /

#define LOG_PROG ((unsigned long) (0х31234567))

#define LOG_VER ((unsigned long) (1)) / * Номер версії * /

#define RLOG ((unsigned long) (1)) / * Номер процедури * /

extern int * rlog_l ();

/ * Внутрішня процедура - нам її використовувати не доведеться * / extern int log_prog_l_freeresult ();

#endif / *! _LOG_H_RPCGEN * /

Розглянемо цей файл уважно. Компілятор транслює ім'я RLOG певне в файлі опису інтерфейсу, в rlog_1, замінюючи прописні символи на рядкові та додаючи номер версії програми з підкресленням. Тип значення, що повертається змінився з int на int *. Таке правило - RPC дозволяє передавати і отримувати тільки адреси оголошених при описі інтерфейсу параметрів. Це ж правило стосується і переданої в якості аргументу рядка. Хоча з файлу print.h це не слід, насправді в якості аргументу функції rlog_l () також передається адреса рядка.

Крім файлу заголовків компілятор rpcgen (l) створює модулі заглушки клієнта і заглушки сервера. По суті, в тексті цих файлів укладено весь код віддаленого виклику.

Заглушка серверу є головний програмою, обробній все мережеве взаємодія з клієнтом (точніше, з його заглушкою). Для виконання операції заглушка сервера виробляє локальний виклик функції, текст якої необхідно написати:

Log.c

#include

#include

#include

#include "log.h"

int * rlog_1 (char ** arg)

{

/ * Значення, що повертається повинно визначатися як static * /

static int result;

int fd; / Файловий дескриптор журналу * /

int len;

result = 1;

/ * 0ткроем файл журналу (створимо, якщо він не існує), в разі невдачі повернемо код помилки 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
© um.co.ua - учбові матеріали та реферати