Programowanie z użyciem RPC



Podobne dokumenty
Sieciowa komunikacja procesów - XDR i RPC

Zastosowanie narzędzia rpcgen

Tworzenie aplikacji rozproszonej w Sun RPC

Zdalne wywołanie procedur. Krzysztof Banaś Systemy rozproszone 1

RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )

Sun RPC/XDR. Dariusz Wawrzyniak 1

Oprogramowanie systemów równoległych i rozproszonych. Wykład 6

external Data Representation

Sun RPC/XDR 10. listopada Dariusz Wawrzyniak (IIPP) 1

76.Struktura oprogramowania rozproszonego.

Zdalne wywołania procedur. Jarosław Kuchta Programowanie Współbieżne

external Data Representation

Systemy rozproszone. Cezary Sobaniec Marek Libuda. Skrypt do ćwiczeń laboratoryjnych. v1.1 07/09/2006

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Język ludzki kod maszynowy

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Wprowadzenie do programowania rozproszonego

Podział programu na moduły

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Podstawy programowania skrót z wykładów:

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Funkcja (podprogram) void

Architektura typu klient - serwer. Oprogramowanie systemów równoległych i rozproszonych. Wykład 6. Cechy architektury klient - serwer

Wywoływanie procedur zdalnych

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Wywoływanie procedur zdalnych

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Zdalne wywoływanie procedur RPC. Dariusz Wawrzyniak 1

Co nie powinno być umieszczane w plikach nagłówkowych:

Tablice, funkcje - wprowadzenie

Wykład 1

Zdalne wywoływanie procedur RPC

Zdalne wywoływanie procedur RPC

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Wstęp do Programowania, laboratorium 02

Grzegorz Cygan. Wstęp do programowania mikrosterowników w języku C

Wywoływanie procedur zdalnych

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów

Wywoływanie metod zdalnych

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Programowanie współbieżne i rozproszone

Część 4 życie programu

Zdalne wywoływanie procedur RPC 27. października Dariusz Wawrzyniak (IIPP) 1

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Zdalne wywoływanie procedur RPC 27. października 2010

Architektury systemów rozproszonych LABORATORIUM. Ćwiczenie 1

Programowanie Proceduralne

Język C - podstawowe informacje

Argumenty wywołania programu, operacje na plikach

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Podstawy wykorzystania bibliotek DLL w skryptach oprogramowania InTouch

Zdalne wywołanie procedur. Krzysztof Banaś Systemy rozproszone 1

Rodzina protokołów TCP/IP. Aplikacja: ipconfig.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Aplikacje RMI

RPC ZDALNE WYWOŁYWANIE PROCEDUR (ang. Remote Procedure Calls)

PARADYGMATY PROGRAMOWANIA Wykład 4

1 Podstawy c++ w pigułce.

1. Brian W. Kernighan, Dennis M. Ritchie, Język ANSI C, WNT, Warszawa 1998.

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Szablony klas, zastosowanie szablonów w programach

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

Wstęp do programowania

Lab 9 Podstawy Programowania

Wskaźniki. Programowanie Proceduralne 1

Wywoływanie metod zdalnych

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

DYNAMICZNE PRZYDZIELANIE PAMIECI

Zdalne wywo lywanie procedur Sun RPC

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

Szablony funkcji i szablony klas

Język C zajęcia nr 11. Funkcje

I. KARTA PRZEDMIOTU CEL PRZEDMIOTU WYMAGANIA WSTĘPNE W ZAKRESIE WIEDZY, UMIEJĘTNOŚCI I INNYCH KOMPETENCJI EFEKTY KSZTAŁCENIA

PROGRAMOWANIE w C prolog

Projektowanie klas c.d. Projektowanie klas przykład

Tunelowanie, kapsułkowanie, XDR. 1. Transmisja tunelowa i kapsułkowanie serwery proxy. 2. Zewnętrzna reprezentacja danych XDR.

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Programowanie niskopoziomowe

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Wskaźniki. Informatyka

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Programowanie - wykład 4

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:

Instytut Teleinformatyki

I - Microsoft Visual Studio C++

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Obsługa wyjątków. Język C++ WW12

1 Podstawy c++ w pigułce.

Wyjątki (exceptions)

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

Krótkie wprowadzenie do korzystania z OpenSSL

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

Wstęp do programowania

Wstęp do programowania 1

Transkrypt:

Programowanie z użyciem RPC 1. Zastosowanie modelu zdalnie wywoływanych procedur. 2. Biblioteka RPC. 3. Podział programu na część lokalną i zdalną. 4. Narzędzie rpcgen. 5. Generowanie programu rozproszonego. 1

Zastosowanie modelu zdalnych wywołań procedur Dzięki ogólności modelu RPC programista może go zastosować na różnych etapach projektowania i realizacji aplikacji rozproszonej: technika konstrukcji specyfikacji programu dane przesyłanie pomiędzy klientem i serwerem są specyfikowane jako argumenty wywołania oraz wartości zwracane przez procedurę, projektowanie programu poszczególne komunikaty zaprojektowanego protokołu odpowiadają wywołaniom procedur, projekt pojęciowy i implementacja jawnie oparta na modelu RPC przesyłanie danych między klientem i serwerem programuje się dokładnie według specyfikacji proceduralnej. Argumenty są kodowane zgodnie ze standardem zewnętrznej reprezentacji danych. Ich typy odpowiadają dokładnie typom danych określonych w specyfikacji, 2

Zastosowanie modelu zdalnych wywołań procedur projekt i implementacja oprogramowania które, jest konstruowane od podstaw programista buduje zwykły program użytkowy rozwiązujący dany problem po czym dzieli go na procedury, które będą działać na różnych komputerach. projekt i implementacja oprogramowania, które wykorzystuje standardowe procedury biblioteczne programista pisze program rozproszony zgodnie ze specyfikacją Sun RPC. Zarejestrowanie zdalnych programów, konstruowanie i przesyłanie komunikatów realizujących wywołania procedur jest realizowane przez procedury biblioteczne, automatyczna generacja kodu opartego na modelu RPC części kodu zawierające wywołania procedur bibliotecznych realizujące komunikacje są generowane automatycznie. 3

Oprogramowanie pomocnicze Implementacje mechanizmu Sun RPC zawierają oprogramowanie pomocnicze, pozwalające w znacznym stopniu zmniejszyć nakład pracy programisty. Można je podzielić na następujące grupy: procedury biblioteczne XDR umożliwiające konwersję typów prostych (int, float) oraz agregatów danych (tablice struktury), procedury RPC służące do wywołania i odebrania wyników ze zdalnej procedury generator programów (procedur łącznikowych) produkujący część plików źródłowych potrzebnych do zbudowania programu rozproszonego. 4

Biblioteka procedur RPC Biblioteka procedur RPC rpc/rpc.h zawiera większość funkcji potrzebnych dla programów korzystających z tego mechanizmu. Przykładowo, aby wywołać zdalną procedurę można użyć callrpc(). int callrpc(char *host, u_long prnum, u_long vnum, u_long pnum, xdrproc_t inproc, char *in, xdrproc_t outproc, char *out); *host nazwa lub adres komputera, prnum, vnum, pnum numery programu, wersji i procedury, inproc, outproc wskaźniki do procedur konwertujących dane, in, out bufory zawierające argumenty oraz miejsce na wynik. Wartość zwracana: 0 w przypadku sukcesu lub numer błędu, który można odczytać używając funkcji clnt_perrno(). Uwaga: Procedura używa protokołu UDP. 5

Biblioteka procedur RPC Program serwera w celu zarejestrowania procedury może wywołać: int registerrpc(u_long prnum, u_long vnum, u_long pnum, char *procname, xdrproc_t inproc, xdrproc_t outproc); prnum, vnum, pnum numery programu, wersji i procedury, procname nazwa funkcji realizującej zdalną procedurę, inproc, outproc wskaźniki do procedur służących do konwersji danych, Wartość zwracana: 0 w przypadku pomyślnej rejestracji, -1 w przeciwnym przypadku. Uwaga: Procedura używa protokołu UDP. Aby uruchomić serwer wystarczy wywołać funkcję svc_run(). 6

Biblioteka procedur RPC Inne popularne funkcje to: CLIENT *clnt_create(char *host, u_long prog, u_long vers, char *proto); zwraca uchwyt obsługujący połączenie ze zdalnym programem. AUTH *authunix_create(char *host, int uid, int gid, int len, int *gids) używana do autoryzacji poprzez mechanizm związany z systemem UNIX. Można konstruować aplikacje, które bezpośrednio wywołują procedury biblioteki RPC, jednak nie jest to najpopularniejsza technika. Zazwyczaj korzysta się z automatycznego generatora. Kod wyprodukowany przez ten generator zawiera wywołania procedur biblioteki RPC. 7

Podział programu na część lokalną i zdalną Procedura A Procedura B Z każdą procedurą jest związany zbiór parametrów formalnych, a z każdym wywołaniem zbiór argumentów. Liczba oraz typy argumentów podanych przez procedurę wywołującą muszą być zgodne z liczbą i typami parametrów formalnych parametry określają interfejs między procedurą wywoływaną i wywołującą. 8

Podział programu na część lokalną i zdalną Procedura A Procedura łącznikowa klienta zdalne wywołanie procedury Procedura łącznikowa serwera Procedura B Procedury łącznikowe dodane do programu realizują zdalne wywołanie procedury. Interfejs tych procedur jest taki sam jak pierwotny interfejs wywołania, dlatego ani procedura wywołująca ani procedura wywoływana nie wymaga modyfikacji. 9

Dodatkowy kod realizujący komunikację RPC Aby przenieść procedurę na inny komputer do programu należy wstawić dodatkowy kod. Po stronie klienta będzie on odpowiedzialny za serializację i konwersję argumentów, wysłanie komunikatu do komputera odległego a następnie odebranie i konwersję wyników. Po stronie serwera dodatkowy moduł przyjmuje zgłoszenia RPC, przekształca argumenty wywołania i przekazuje je właściwej procedurze. Po jej wykonaniu przekształca i odsyła wyniki. Te dodatkowe moduły mogą mieć postać procedur, w których będą ukryte wszystkie szczegóły dotyczące komunikacji między procedurami lokalnymi i odległymi. W ten sposób kod wykonujący operacje RPC pozostanie oddzielony od kodu aplikacji. 10

Podział programu na część lokalną i zdalną Procedura A1 Dyspozytor Procedura łącznikowa klienta dla A1 Procedura łącznikowa klienta dla A2 Procedura A2 Procedura łącznikowa klienta dla B1 Procedura B1 Procedura łącznikowa klienta dla B2 Procedura B2 11

Podział programu - podsumowanie Aby uzyskać rozproszoną wersję aplikacji, trzeba przenieść jedną lub więcej procedur do komputera odległego. Dodanie procedur łącznikowych jest rozwiązaniem pozwalającym pozostawić procedury wywołujące i wywoływane w ich pierwotnej postaci, pod warunkiem, że każda procedura łącznikowa po stronie klienta będzie nazwana tak samo jak procedura wywoływana w pierwotnym programie. 12

Zastosowanie narzędzia rpcgen W implementacjach Sun RPC jest dostępne narzędzie pozwalające znacznie zmniejszyć nakład pracy potrzebny do skonstruowania aplikacji rozproszonej rpcgen. Na wejściu otrzymuje on plik specyfikacji zawierający deklaracje stałych, globalnych typów danych, zmiennych globalnych i zdalnie wywoływanych procedur. Pliki kodu źródłowego otrzymane na wyjściu to przede wszystkim procedury łącznikowe dla strony klienta i serwera zawierający kod realizujący serializację argumentów, wysyłanie i odbieranie komunikatów RPC, konwersję danych pomiędzy reprezentacją natywną i zewnętrzną. 13

Procedury łącznikowe przy użyciu rpcgen Procedura A Procedura sprzęgająca klienta Komunikacyjna procedura łącznikowa klienta Komunikacyjna procedura łącznikowa serwera Procedura sprzęgająca serwera Procedura B Procedura łącznikowa zostaje podzielona na część komunikacyjną i sprzęgającą. Część komunikacyjna jest niemal identyczna dla wszystkich aplikacji rozproszonych. Część sprzęgająca pełni rolę interfejsu pomiędzy procedurą komunikacyjną a programem. 14

Pliki związane z rpcgen Nazwa pliku Zawartość plik.x plik wejściowy specyfikacja zdalnego programu plik.h plik_xdr.c plik_clnt.c plik_svc.c deklaracje typów używanych w wygenerowanym kodzie. wywołania procedur XDR używanych przez klienta i program serwera w celu w celu dokonania serializacji argumentów. łącznikowa procedura komunikacyjna strony klienta. łącznikowa procedura komunikacyjna strony serwera. 15

Struktura programu rozproszonego (rpcgen) Program użytkowy klienta Procedury sprzęgająca klienta plik.x rpcgen plik_clnt.c plik.h plik_xdr.c plik_svc.c kompilator C kompilator C Klient Serwer Zdalnie wywoływane procedury Procedury sprzęgająca serwera 16 16

Generowanie programu rozproszonego (przykład) Budowanie aplikacji rozproszonej z wykorzystaniem narzędzia rpcgen odbywa się w ośmiu krokach: 1. Skonstruowanie i przetestowanie zwykłego (działającego lokalnie) programu użytkowego. 2. Podział programu na część lokalną i zdalną. 3. Napisanie specyfikacji zdalnie wywoływanego programu wykorzystywanej przez rpcgen. 4. Użycie generatora rpcgen do wyprodukowania plików źródłowych wykorzystywanych do budowy klienta i serwera. 17

Generowanie programu rozproszonego (przykład) 5. Implementacja procedur sprzęgających po stronie klienta i serwera. 6. Uzupełnienie, kompilacja i konsolidacja (linkowanie) plików składających się na program kliencki. 7. Uzupełnienie, kompilacja i konsolidacja (linkowanie) plików składających się na program serwera. 8. Uruchomienie serwera na komputerze odległym i klienta (jednego lub wielu) na komputerach lokalnych. 18

Krok 1: program lokalny Przykładowy program przedstawia prostą implementację dla zbioru słów. #include<stdio.h> #define WORDLEN 50 int main(int argc, char **argv){ char cmdline[wordlen+3]; char cmd; int i; while(1){ scanf("%s", cmdline); if (strlen(cmdline)<1){ printf("brak komendy\n"); continue; } cmd = cmdline[0]; switch(cmd){ case 'I': i = init(); printf("zbior zainicjowany (%d)\n", i); break; 19

Krok 1: program lokalny } case 'i': i = insert(cmdline + 2); printf("wstawiono '%s' (%d)\n", cmdline + 2, i); break; case 'd': i = delete(cmdline + 2); printf("skasowano '%s' (%d)\n", cmdline + 2, i); break; case 'l': if((i = lookup(cmdline + 2))>=0){ printf("slowo '%s' odnalezione (%d)\n", cmdline + 2, i); }else{ printf("slowo '%s' nieodnalezione (%d)\n", cmdline + 2, i); } break; case 'q': printf("koniec pracy\n"); exit(1); default: printf("nieznana komenda '%c' \n", cmd); break; }// switch }// while 20

Krok 1: program lokalny Procedury realizujące poszczególne funkcje programu: #define SETSIZE 100 char wordset[setsize][wordlen+1]; int size = 0; int init(){ size = 0; return 1; } int insert(char *word){ strcpy(wordset[size], word); return ++size; } int lookup(char *word){ int i, found = -1; for(i=0; i<size; i++){ if (strcmp(wordset[i], word)==0){ found = i; break; } } return found; } 21

Krok 1: program lokalny int delete(char *word){ int i, j; i = lookup(word); if(i>=0){ for (j=i; j<size; j++){ strcpy(wordset[j], wordset[j+1]); } size--; } return size; } Przykładowe komendy wydawane programowi po uruchomieniu: I i:jeden i:dwa l:jeden d:jeden l:jeden l:dwa 22

Krok 2: podział programu main scanf init insert lookup delete main scanf init insert lookup delete Dane używane jako zbiór słów 23

Krok 3: specyfikacja dla rpcgen Specyfikacja musi zawierać deklaracje: stałych używanych w programie, typów danych, używanych zdalnych programów i funkcji. Specyfikacja jest pisana w języku RPC plik rset.x. const WORDLEN=50; const SETSIZE=100; struct example{ // przykład, obrazujące struktury XDR int id; char c; }; program RSETPROG{ // deklaracja nazwy zdalnego programu version RSETVERS { // deklaracja wersji int INIT(void) = 1; // deklaracje zdalnych procedur int INSERT(string) = 2; int LOOKUP(string) = 3; int DELETE(string) = 4; } = 1; // numer wersji } = 0x22334455; // numer programu 24

Numeracja zdalnych programów Przestrzeń numerów dla zdalnych programów: 0 1fffffff określone przez firmę Sun 20000000 3fffffff do wykorzystania lokalnego 40000000 5fffffff dla aplikacji wykorzystujących dynamiczne numerowanie programów 60000000 7fffffff pozostałe adresy są zarezerwowane 80000000 9fffffff do późniejszego wykorzystania a0000000 bfffffff c0000000 dfffffff i nie powinny być używane w programach e0000000 - ffffffff 25 25

Krok 4: użycie rpcgen Program rpcgen na podstawie specyfikacji tworzy pliki źródłowe wykorzystywane do kompilacji programu klienckiego i serwera. Plik rset.h zawiera deklaracje używane przez oba programy:deklaracje używane przez oba programy: #ifndef _RSET_H_RPCGEN #define _RSET_H_RPCGEN #include <rpc/rpc.h> #ifdef cplusplus extern "C" { #endif #define WORDLEN 50 #define SETSIZE 100 struct example { int id; char c; }; typedef struct example example; 26

Krok 4: użycie rpcgen #define RSETPROG 0x22334455 #define RSETVERS 1... #define INIT 1 extern int * init_1(void *, CLIENT *); extern int * init_1_svc(void *, struct svc_req *); #define INSERT 2 extern int * insert_1(char **, CLIENT *); extern int * insert_1_svc(char **, struct svc_req *); #define LOOKUP 3 extern int * lookup_1(char **, CLIENT *); extern int * lookup_1_svc(char **, struct svc_req *); #define DELETE 4 extern int * delete_1(char **, CLIENT *); extern int * delete_1_svc(char **, struct svc_req *); extern int rsetprog_1_freeresult (SVCXPRT *, xdrproc_t, caddr_t); 27

Krok 4: użycie rpcgen /* the xdr functions */ extern bool_t xdr_example (XDR *, example*);... #endif /*!_RSET_H_RPCGEN */ Zdefiniowane procedury zewnętrzne (np. init_1() i init_1_svc()) są procedurami łącznikowymi, które powinny być napisane przez programistę. 28

Krok 4: użycie rpcgen Plik rset_xdr.c jest tworzony gdy w specyfikacji były zdefiniowane dodatkowe struktury, z których korzysta program. #include "rset.h" bool_t xdr_example (XDR *xdrs, example *objp){ register int32_t *buf; } if (!xdr_int (xdrs, &objp->id)) return FALSE; if (!xdr_char (xdrs, &objp->c)) return FALSE; return TRUE; 29

Krok 5: procedury łącznikowe Plik rset_clnt.c zawiera komunikacyjne procedury łącznikowe klienta, np. int *insert_1(char **argp, CLIENT *clnt){ static int clnt_res; memset((char *)&clnt_res, 0, sizeof(clnt_res)); if (clnt_call (clnt, INSERT, (xdrproc_t) xdr_wrapstring, (caddr_t) argp, (xdrproc_t) xdr_int, (caddr_t) &clnt_res, TIMEOUT)!= RPC_SUCCESS) { // wywołanie zdalnej procedury return (NULL); } return (&clnt_res); } Program klienta uzupełniamy o definicję procedur łącznikowych. Zwykle definiuje się je w osobnym pliku rset_cif.c (krok 5). int insert(char *word){ char **arg; arg = &word; return *insert_1(arg, handle); } 30

Krok 5: procedury łącznikowe Plik rset_svc.c zawiera kod serwera.... char *result; xdrproc_t _xdr_argument, _xdr_result; char *(*local)(char *, struct svc_req *);... case INSERT: _xdr_argument = (xdrproc_t) xdr_wrapstring; _xdr_result = (xdrproc_t) xdr_int; local = (char *(*)(char *, struct svc_req *)) insert_1_svc; break;... memset ((char *)&argument, 0, sizeof (argument)); if (!svc_getargs (transp, (xdrproc_t)_xdr_argument, (caddr_t)&argument)){ svcerr_decode (transp); return; } // pobranie argumentów result = (*local)((char *)&argument, rqstp); // wywołanie procedury if (result!= NULL &&!svc_sendreply(transp, (xdrproc_t)_xdr_result, result)){ svcerr_systemerr (transp); } // wysłanie odpowiedzi if (!svc_freeargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)){ fprintf (stderr, "%s", "unable to free arguments"); exit(1); } // zwolnienie pamięci 31

Krok 5: procedury łącznikowe Procedury łącznikowe serwera zazwyczaj grupowane są w osobnym pliku (rset_sif.c). #include<rpc/rpc.h> #include "rset.h" static int retint; int *init_1_svc(void *w, struct svc_req *sreq){ retint = init(); return &retint; } int *insert_1_svc(char **w, struct svc_req *sreq){ retint = insert(*w); return &retint; }... 32

Krok 6: kompilacja klienta W pliku źródłowym klienta rset.c należy dodać fragmenty kodu związane z inicjacją połączenia RPC. #include<rpc/rpc.h> #include"rset.h" #define RMACHINE "komputer.domena" // nazwa lub adres ip serwera CLIENT *handle; // uchwyt wykorzystywany do komunikacji... if ((handle=clnt_create(rmachine, RSETPROG, RSETVERS, "tcp"))==null){ printf("nie mozna nawiazac polaczenia\n"); exit(1); } // nawiązanie połączenia Kompilacja i linkowanie: gcc -o rset rset.c rset_cif.c rset_clnt.c rset_xdr.c 33

Krok 7: kompilacja serwera Na serwer, oprócz plików wygenerowanych automatycznie: rset_svr.c, rset_xdr.c i funkcji łącznikowych rset_sif.c i składa się plik zawierający implementację zdalnych funkcji rset_fun.c. Kompilacja i linkowanie: gcc -o rsetd rset_svr.c rset_fun.c rset_sif.c rset_xdr.c 34

Krok 8: testowanie i uruchomienie programu Serwer powinien rozpocząć działanie zanim klient nawiąże próbę połączenia. Zarówno program klienta jak i serwer można w celach testowych uruchomić na tym samym komputerze. W tym celu należy w programie rset.c zastąpić istniejącą deklarację przez: #define RMACHINE "localhost" Aby ułatwić zarządzanie projektem podczas poprawiania lub wprowadzania zmian, warto zautomatyzować proces kompilacji za pomocą narzędzia make. 35

Podsumowanie Zwykle do konstrukcji programów rozproszonych wykorzystywane jest narzędzie rpcgen. Proces budowania aplikacji rozproszonej można podzielić na osiem etapów. Najpierw programista buduje zwykły program lokalny. Następnie musi on zostać podzielony na część lokalną i zdalną. Program rpcgen automatycznie generuje większość kodu potrzebnego do obsługi komunikacji RPC. Pomimo tego konwersją do modelu rozproszonego zwykle jest pracochłonna i wymaga uwagi. 36