Tworzenie aplikacji rozproszonej w Sun RPC Budowa aplikacji realizowana jest w następujących krokach: Tworzenie interfejsu serwera w języku opisu interfejsu RPCGEN Tworzenie: namiastki serwera namiastki klienta pliku nagłówkowego pliku konwersji Implementacja usług serwerowych Implementacja aplikacji klienta
Działanie aplikacji opartej na Sun RPC Aplikacja serwera Otrzymanie identyfikatora transportu (transport handle) Zarejestrowanie usługi u demona portmap / rpcbind Oczekiwanie na zgłoszenia klienta i wykonywanie jego zlecen Aplikacja klienta Otrzymanie identyfikatora klienta (client handle) Wywoływanie odległych procedur Likwidacja identyfikatora klienta gdy nie jest potrzebny
Język opisu interfejsu RPCGEN RPCGEN jest jezykiem definiowania interfejsu i prekompilatorem. Na podstawie definicji interfejsu RPCGEN tworzy naste pujace pliki w je zyku C: Namiastka klienta (client stub) Namiastka serwera (server stub) Plik konwersji danych Plik nagłowkowy Opcjonalnie szkielet aplikacji serwera Opcjonalnie szkielet aplikacji klienta
Język opisu interfejsu RPCGEN Je zyk RPCGEN akceptuje naste pujace typy danych: Typ pusty void Znak char Typ całkowity int, short int, long int (unsigned) Typ zmiennoprzecinkowy float, double Tablice o stałej długosci typ nazwa [zakres] Tablice o zmiennej długosci typ nazwa <zakres> Łancuch string <zakres> Struktura struct {...} Typ złozony typedef nazwa definicja
Język opisu interfejsu RPCGEN Przekazywanie argumentow: Wywołanie odległej procedury dopuszcza tylko jeden argument wywołania i zwraca jeden wynik Gdy wyste puje wie cej elementow to nalezy umiescic je w strukturach W programach klienta i serwera argumentem lub wynikiem jest wtedy wskaznik na strukturee
Generowanie aplikacji RPC Domyślne rpcgen plik.x Kod serwera Kod klienta Definicja interfejsu w języku RPCGEN RPCGEN Stopka serwera Filtry XDR Plik nagłówkowy Kompilacja Aplikacja serwera Aplikacja klienta Stopka klienta
Generowanie aplikacji RPC Rozszerzone rpcgen -a -C plik.x Definicja interfejsu w języku RPCGEN RPCGEN Szkielet serwera Stopka serwera Filtry XDR Plik nagłówkowy Kompilacja Aplikacja serwera Aplikacja klienta Stopka klienta Szkielet klienta
Komunikacja klient-serwer Komunikacja może odbywać się z wykorzystaniem protokołu TCP lub UDP Adresowanie w RPC: Nazwa (adres IP) komputera na ktorym uruchomiony jest serwer Numer programu Numer wersji Numer procedury RPC wymaga działania tzw. portmappera portmap / rpcbind Portmapper jest serwerem nazewniczym, ktory zamienia numery programu RPC na numery portow protokołu TCP albo UDP
Komunikacja klient-serwer Procedury zdalne na danym komputerze identyfikowane są za pomocą trzech liczb: numer programu numer wersji programu numer procedury Numer programu i wersji identyfikuje procesy serwerowe Numery procedur identyfikuja procedury w serwerze
Komunikacja klient-serwer Numery programów (HEX) 00000000 1FFFFFFF Sun 20000000 3FFFFFFF Administrator lokalny 40000000 5FFFFFFF Programista 60000000 FFFFFFFF Zastrzezone
Komunikacja klient-serwer Serwer po uruchomieniu informuje portmapper na ktorych portach nasłuchuje, i jakimi numerami programowymi RPC dysponuje Klient odwołując się do danego numeru programu, najpierw komunikuje się z portmapperem na maszynie serwera w celu określenia numeru portu do którego należy wysłać pakiet RPC Informacje o numerach portów można uzyskać za pomocą rpcinfo $ rpcinfo -p localhost program vers proto 100000 4 udp 100000 4 tcp 587202561 1 udp 587202561 1 tcp 588321041 1 udp 588321041 1 tcp port 111 111 56013 51408 59268 51412 portmapper portmapper
Budowa aplikacji RPC Maszyna B Aplikacja serwera Program Procedura 1 Procedura 2 Procedura 3 Wywołanie Maszyna A Aplikacja klienta Lokalizacja Rejestracja Portmapper
Przykład 1 - Mnożenie 2 liczb całkowitych Argumenty int a int b Wynik int c Funkcja Multiply
Przykład 1 - Mnożenie 2 liczb całkowitych Zawartość pliku mul.x /*--------------------------------------------------*/ struct operands { int a; int b; }; /*--------------------------------------------------*/ program MUL_PROG { version MUL_VERS { int Multiply(operands) = 1; } = 1; } = 0x20000001; /*--------------------------------------------------*/
Przykład 1 - Mnożenie 2 liczb całkowitych Kompilacja rpcgen -a -C mul.x
Przykład 1 - Mnożenie 2 liczb całkowitych Klient Serwer
Przykład 1 - Mnożenie 2 liczb całkowitych Plik mul_server.c
Przykład 1 - Mnożenie 2 liczb całkowitych Plik mul_client.c
Przykład 1 - Mnożenie 2 liczb całkowitych Modyfikacja pliku mul_server.c
Przykład 1 - Mnożenie 2 liczb całkowitych Modyfikacja pliku mul_client.c
Przykład 2 - Operacje tekstowe Argumenty char Buffer[100] int Size Wyniki char Buffer[100] int Size Funkcje UpperCase LowerCase
Przykład 2 - Operacje tekstowe Zawartość pliku text.x /*--------------------------------------------------*/ struct Data { char Buffer[100]; int Size; }; /*--------------------------------------------------*/ program TEXT_PROG { version TEXT_VERS { Data UpperCase(Data) = 1; Data LowerCase(Data) = 2; } = 1; } = 0x23000001; /*--------------------------------------------------*/
Przykład 2 - Operacje tekstowe Kompilacja rpcgen -a -C text.x
Przykład 2 - Operacje tekstowe Klient Serwer
Przykład 2 - Operacje tekstowe Modyfikacja pliku text_server.c
Przykład 2 - Operacje tekstowe Modyfikacja pliku text_client.c
Przykład 2 - Operacje tekstowe Modyfikacja pliku text_client.c - c.d.
Przykład 3 - Aplikacja GUI Argumenty char Buffer[100] int Size Wyniki char Buffer[100] int Size Funkcje UpperCase LowerCase
Przykład 3 - Aplikacja GUI
Przykład 3 - Aplikacja GUI Modyfikacja pliku mainwindow.h
Przykład 3 - Aplikacja GUI Modyfikacja pliku mainwindow.cpp
Przykład 3 - Aplikacja GUI Modyfikacja pliku mainwindow.cpp
Przykład 3 - Aplikacja GUI Modyfikacja pliku mainwindow.cpp c.d.
Przykład 3 - Aplikacja GUI Działająca aplikacja