Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

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

Podobne prezentacje


Prezentacja na temat: "Zdalne wywołania procedur Jarosław Kuchta Programowanie Współbieżne."— Zapis prezentacji:

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

2 2RPC Podstawy RPC – Remote Procedure Call RPC – Remote Procedure Call Wywołanie procedur jednego procesu z innego procesu. Wywołanie procedur jednego procesu z innego procesu. Proces wywoływany – serwer Proces wywoływany – serwer Proces wywołujący - klient Proces wywołujący - klient Wywoływana procedura jest wykonywana w przestrzeni adresowej wywoływanego procesu (serwera). Wywoływana procedura jest wykonywana w przestrzeni adresowej wywoływanego procesu (serwera).

3 3RPC RPC w sieci protokół opracowany przez firmę Sun protokół opracowany przez firmę Sun popularny w systemie Unix popularny w systemie Unix obsługiwany w bibliotekach języka Java obsługiwany w bibliotekach języka JavaJava współcześnie obsługiwany przez protokoły: współcześnie obsługiwany przez protokoły: SOAP SOAP CORBA CORBA XML-RPC XML-RPC JSON-RPC JSON-RPC

4 4RPC XDR – External Data Representation standard jednolitej reprezentacji danych standard jednolitej reprezentacji danych w sieci między komputerami o różnych architekturach w sieci między komputerami o różnych architekturach warunki podstawowe warunki podstawowe wszystkie typy danych mają rozmiar będący wielokrotnością 4 bajtów, wszystkie typy danych mają rozmiar będący wielokrotnością 4 bajtów, liczby całkowite kodowane w standardzie BigEndian (najpierw starsze bajty) liczby całkowite kodowane w standardzie BigEndian (najpierw starsze bajty) liczby rzeczywiste w formacie IEEE. liczby rzeczywiste w formacie IEEE. nadawca i odbiorca muszą znać struktury danych (nie są przekazywane) nadawca i odbiorca muszą znać struktury danych (nie są przekazywane)

5 5RPC Filtry XDR xdr_int xdr_int xdr_float xdr_float xdr_char xdr_char xdr_wrapstring (dla typu char *) xdr_wrapstring (dla typu char *)

6 6RPC Filtry XDR dla struktur struktura struktura struct s { int i, float x } struct s { int i, float x } filtr filtr int xdr_s (XDR *xptr, struct s *sptr) int xdr_s (XDR *xptr, struct s *sptr) { return (xdr_int(xptr, &sptr->i) && xdr_float(xptr, &sptr->x); } xdr_float(xptr, &sptr->x); }

7 7RPC Identyfikacja procedury trzy liczby całkowite: trzy liczby całkowite: numer programu numer programu numer wersji numer wersji numer procedury numer procedury

8 8RPC Rejestracja procedury int registerrpc( int registerrpc( unsigned long PROG, unsigned long PROG, unsigned long VERS, unsigned long VERS, unsigned long PROC, unsigned long PROC, char * ( * proc)(), // adres procedury char * ( * proc)(), // adres procedury int (* xdr_arg)(), // adres filtra argumentów int (* xdr_arg)(), // adres filtra argumentów int (* xdr_res)()); // adres filtra wyników int (* xdr_res)()); // adres filtra wyników

9 9RPC Przykład – procedura udostępniająca czas systemowy #include #include #define PRZYKLAD 0x #define WERSJA 1 #define CZAS 1 typedef struct { … } tt; extern void podaj_czas (tt *) { … } char *czas (void) { static tt t; static tt t; podaj_czas (&t); podaj_czas (&t); return (char *)&t; return (char *)&t;} void main (void) { registerrpc ( PRZYKŁAD, WERSJA, CZAS, czas, xdr_void, xdr_t); svc_run(); }

10 10RPC Wywołanie procedury zdalnej int callrpc( int callrpc( char *server, // nazwa serwera char *server, // nazwa serwera unsigned long PROG, unsigned long PROG, unsigned long VERS, unsigned long VERS, unsigned long PROC, unsigned long PROC, int (* xdr_arg)(), int (* xdr_arg)(), char *arg, // struktura argumentów char *arg, // struktura argumentów int (* xdr_res)(), int (* xdr_res)(), char *res); // struktura wyników char *res); // struktura wyników

11 11RPC Przykład – wywołanie procedury udostępniającej czas systemowy #include #include #define PRZYKLAD 0x #define WERSJA 1 #define CZAS 1 typedef struct { … } tt; int xdr_t (XDR *xptr, tt *tp) { … } extern void korzystaj (tt *); void main (void) { tt t; callrpc("servername", PRZYKŁAD, WERSJA, CZAS, xdr_void, NULL, xdr_t, &t); korzystaj (&t); }

12 12RPC clnt_broadcast RPC a wykonanie równoległe mainproc registerrpc callrpc zwykłe wywołanie RPC proces wywołujący jest wstrzymywany mainproc registerrpc wywołanie przez rozgłaszanie proc procesy wywoływane są równolegle

13 13RPC Wykonanie równoległe – przez rozgłaszanie int clnt_broadcast( int clnt_broadcast( unsigned long PROG, unsigned long PROG, unsigned long VERS, unsigned long VERS, unsigned long PROC, unsigned long PROC, int (* xdr_arg)(), int (* xdr_arg)(), char *arg, char *arg, int (* xdr_res)(), int (* xdr_res)(), char *res, char *res, int (* res_proc)()); int (* res_proc)());

14 14RPC Przykład – wywołanie procedury przez rozgłaszanie #include #include #define PRZYKLAD 0x #define WERSJA 1 #define CZAS 1 typedef struct { … } tt; int xdr_t (XDR *xptr, tt *tp) { … } extern void korzystaj (tt *); int po_rozgloszeniu (char *t, struct socketaddr_in *addr) { return true; return true;} void main (void) { tt t; clnt_broadcast( PRZYKŁAD, WERSJA, CZAS, xdr_void, NULL, xdr_t, &t, po_rozgloszeniu); korzystaj (&t); }

15 15RPC Ograniczenia Brak mechanizmu wstrzymywania procesów Brak mechanizmu wstrzymywania procesów rozwiązanie: wysokopoziomowe mechanizmy synchronizacji rozwiązanie: wysokopoziomowe mechanizmy synchronizacji w Unix RPC – blokowanie procesu wywoływanego w Unix RPC – blokowanie procesu wywoływanego konieczność jawnego podawania nazwy serwera konieczność jawnego podawania nazwy serwera rozwiązanie: rpc_bind rozwiązanie: rpc_bind zdalne rozgłaszanie – przynajmniej jedna procedura musi być wykonywana zdalne rozgłaszanie – przynajmniej jedna procedura musi być wykonywana

16 16RPC Asynchroniczne RPC – deklaracja procedury (IDL) [ uuid (7f6c4340-eb67-11d1-b9d7-00c04fad9a3b), version(1.0), pointer_default(unique) ] interface AsyncRPC { const long DEFAULT_ASYNC_DELAY = 10000; const short APP_ERROR = -1; const char* DEFAULT_PROTOCOL_SEQUENCE = "ncacn_ip_tcp"; const char* DEFAULT_ENDPOINT = "8765"; void NonAsyncFunc(handle_t hBinding, [in, string] unsigned char * pszMessage); void AsyncFunc(handle_t hBinding, [in] unsigned long nAsychDelay); void Shutdown(handle_t hBinding); }

17 17RPC IDL IDL – Interface Description Language IDL – Interface Description Language MIDL – kompilator IDL MIDL – kompilator IDL

18 18RPC Alternatywa – atrybuty ACF ACF – Application Configuration File ACF – Application Configuration File IDL + ACF: IDL + ACF: interface AsyncRPC { [async] AsyncFunc(); [async] AsyncFunc();}

19 19RPC Wywołanie asynchroniczne (1) RPC_ASYNC_STATE Async; RPC_STATUS status; // Initialize the handle. status = RpcAsyncInitializeHandle(&Async, sizeof(RPC_ASYNC_STATE)); if (status) { // Code to handle the error goes here. } Async.UserInfo = NULL; Async.NotificationType = RpcNotificationTypeEvent; Async.u.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (Async.u.hEvent == 0) { // Code to handle the error goes here. }

20 20RPC Wywołanie asynchroniczne (2) // Call an asynchronous RPC routine here RpcTryExcept{ printf("\nCalling the remote procedure 'AsyncFunc'\n"); AsyncFunc(&Async, AsyncRPC_ClientIfHandle, nAsychDelay); }RpcExcept(1){ ulCode = RpcExceptionCode(); printf("AsyncFunc: Run time reported exception 0x%lx = %ld\n", ulCode, ulCode); }RpcEndExcept

21 21RPC Wywołanie synchroniczne tej samej procedury // Call a synchronous routine while the asynchronous procedure is still running RpcTryExcept{ printf("\nCalling the remote procedure 'NonAsyncFunc'\n"); printf("\nCalling the remote procedure 'NonAsyncFunc'\n"); NonAsyncFunc(AsyncRPC_ClientIfHandle, pszMessage); NonAsyncFunc(AsyncRPC_ClientIfHandle, pszMessage); fprintf(stderr, "While 'AsyncFunc' is running asynchronously,\n" fprintf(stderr, "While 'AsyncFunc' is running asynchronously,\n" "we still can send message to the server in the mean time.\n\n"); "we still can send message to the server in the mean time.\n\n");}RpcExcept(1){ ulCode = RpcExceptionCode(); ulCode = RpcExceptionCode(); printf("NonAsyncFunc: Run time reported exception 0x%lx = %ld\n", printf("NonAsyncFunc: Run time reported exception 0x%lx = %ld\n", ulCode, ulCode); ulCode, ulCode);}RpcEndExcept

22 22RPC Oczekiwanie na odpowiedź bez blokowania własnego wątku: bez blokowania własnego wątku: // This code fragment assumes that Async is a valid asynchronous RPC handle. if (WaitForSingleObject(Async.u.hEvent, INFINITE) == WAIT_FAILED) { RpcRaiseException(APP_ERROR); RpcRaiseException(APP_ERROR);} z blokowaniem własnego wątku: z blokowaniem własnego wątku: if (SleepEx(INFINITE, TRUE) != WAIT_IO_COMPLETION) { RpcRaiseException(APP_ERROR); RpcRaiseException(APP_ERROR);}

23 23RPC Obsługa wywołania przez serwer (1) void AsyncFunc(IN PRPC_ASYNC_STATE pAsync, IN RPC_BINDING_HANDLE hBinding, IN RPC_BINDING_HANDLE hBinding, IN OUT unsigned long nAsychDelay) IN OUT unsigned long nAsychDelay){ int nReply = 1; int nReply = 1; RPC_STATUS status; RPC_STATUS status; unsigned long nTmpAsychDelay; unsigned long nTmpAsychDelay; int i; int i; if (nAsychDelay < 0) if (nAsychDelay < 0) nAsychDelay = DEFAULT_ASYNC_DELAY; nAsychDelay = DEFAULT_ASYNC_DELAY; else if (nAsychDelay < 100) else if (nAsychDelay < 100) nAsychDelay = 100; nAsychDelay = 100;

24 24RPC Obsługa wywołania przez serwer (2) // We only call RpcServerTestCancel if the call // takes longer than ASYNC_CANCEL_CHECK ms if (nAsychDelay > ASYNC_CANCEL_CHECK) { nTmpAsychDelay = nAsychDelay/100; nTmpAsychDelay = nAsychDelay/100; for (i = 0; i < 100; i++) for (i = 0; i < 100; i++) { Sleep(nTmpAsychDelay); Sleep(nTmpAsychDelay); if (i%5 == 0) if (i%5 == 0) { fprintf(stderr, fprintf(stderr, "\rRunning AsyncFunc (%lu ms) (%d%c)... ", nAsychDelay, i+5, PERCENT); "\rRunning AsyncFunc (%lu ms) (%d%c)... ", nAsychDelay, i+5, PERCENT); status = RpcServerTestCancel( RpcAsyncGetCallHandle(pAsync)); status = RpcServerTestCancel( RpcAsyncGetCallHandle(pAsync)); if (status == RPC_S_OK) { fprintf(stderr, "\nAsyncFunc has been canceled!!!\n"); break; } else if (status != RPC_S_CALL_IN_PROGRESS) { printf("RpcAsyncInitializeHandle returned 0x%x\n", status); exit(status); } else Sleep(nAsychDelay);

25 25RPC Wysłanie odpowiedzi przez serwer printf("\nCalling RpcAsyncCompleteCall\n"); printf("\nCalling RpcAsyncCompleteCall\n"); status = RpcAsyncCompleteCall(pAsync, &nReply); status = RpcAsyncCompleteCall(pAsync, &nReply); printf("RpcAsyncCompleteCall returned 0x%x\n", status); printf("RpcAsyncCompleteCall returned 0x%x\n", status); if (status) if (status) exit(status); exit(status);}

26 26RPC Przyjęcie odpowiedzi przez klienta status = RpcAsyncCompleteCall( &Async, &Reply); &Async, &Reply); // W tym momencie wynik jest zwracany w Reply


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

Podobne prezentacje


Reklamy Google