Головна

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

client.c

#include

#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 Адрес_хоста \ n",

argv [0]);

exit (1);

}

server = argv [1];

/ * Отримаємо дескриптор клієнта. У разі невдачі - повідомимо про

неможливості встановлення зв'язку з сервером * /

if ((з1 = 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 - Клієнт запущений", clnttime);

/ * Передамо повідомлення для журналу - час початку роботи клієнта. У разі невдачі - повідомимо про помилку * /

if ((result = rlog_l (& mystring, cl)) == NULL) {

fprintf (stderr, "error2 \ n");

clnt_perror (cl, server);

exit (3);

}

/ * B разі невдачі на віддаленому комп'ютері повідомимо про помилку * /

if (* result! = 0)

fprintf (stderr, "Не можу записати журнал \ n");

/ * 0свободім дескриптор * /

cint destroy (cl);

exit (0);

}

Заглушка клієнта log_clnt.c компілюється з модулем client.c для отримання виконуваної програми клієнта.

cc -о rlog client.c log_clnt.c -Insl

Заглушка серверу log_svc.c і процедура log.c компілюються для отримання виконуваної програми сервера.

cc -о logger log_svc.c log.c -Insl

Тепер на деякому хості server.nowhere.ru необхідно запустити серверний процес:

$ logger

Після чого при запуску клієнта rlog на іншій машині сервер додасть відповідний запис в файл журналу.

Схема роботи RPC в цьому випадку приведена на рис. 1. Модулі взаємодіють наступним чином:

1. Коли запускається серверний процес, він створює сокет UDP і пов'язує будь-який локальний порт з цим сокетом. Далі сервер викликає бібліотечну функцію svc_register (3N) для реєстрації номерів програми і її версії. Для цього функція звертається до процесу portmap (IM) і передає необхідні значення. Сервер portmap (IM) зазвичай запускається при ініціалізації системи і зв'язується з деяких загальновідомих портом. Тепер portmap (3N) знає номер порту для нашої програми і версії. Сервер ж очікує отримання запиту. Зауважимо, що всі описані дії виробляються заглушкою сервера, створеної компілятором rpcgen (IM).

2. Коли запускається програма rlog, перше, що вона робить, - викликає бібліотечну функцію clnt_create (3N), вказуючи їй адреса віддаленої системи, номера програми і версії, а також транспортний протокол. Функція направляє запит до сервера portmap (IM) віддаленої системи server.nowhere.m і отримує номер віддаленого порту для сервера журналу.

3. Клієнт викликає процедуру rlog_1 (), визначену в заглушці клієнта, і передає управління заглушці. Та, в свою чергу, формує запит (перетворюючи аргументи на формат XDR) у вигляді пакета UDP і направляє його на віддалений порт, отриманий від сервера portmap (IM). Потім вона деякий час очікує відгуку і в разі неотримання повторно відправляє запит. За сприятливих обставин запит приймається сервером logger (модулем заглушки сервера). Заглушка визначає, яка саме функція була викликана (за номером процедури), і викликає функцію rlog_1 () модуля log.c. Після повернення управління назад в заглушку остання перетворює повернене функцією rlog_1 () значення в формат XDR, і формує відгук також у вигляді пакету UDP. Після отримання відгуку заглушка клієнта витягує повернене значення, перетворює його і повертає в головний програму клієнта.

 

 



Як це працює? | Міністерство освіти Республіки Білорусь
© um.co.ua - учбові матеріали та реферати