rzone przez rpcgen. Plik f act_client. c to szablon klienta. Znów program posłużył się nazwą f act jako bazą i dodał tylko przyrostek _cl ient. c. Zawartość pliku pokazuje ilustracja 9.21.
/*
* Ten kod został wygenerowany przez rpcgen.
* To tylko szablon, którego można używać jako
* wzorca dla własnych funkcji.
*/
łinclude "fact.h" void%
factorial_l(char *host) {
CLIENT *clnt; long *result_l; int calc_fac_l_arg; łifndef DEBUG
clnt = clnt_create(host, FACTORIAL, ONE, "netpath"); if (clnt — (CLIENT *>. NULL) {
clnt j>createerror (host);
ovit (i i ,
)
łendif /* DEBUG */
result_l - calc_fac_l(Scalc_fac_l_arg, clnt); if (result_l =- (long *) NULL) (
clnt_perror(clnt, "cali failed");
)
łifndef DEBUG
clnt_destroy(clnt); łendif /* DEBUG */
)
main(int argc, char *argv[ ]) (
char *host;
if (argc < 2) {
printf("usage: %s host_server\n", argv[OJ);
exit(1);
host - argv(1); factorial_l (host);
W pliku szablonu rpcgen utworzył funkcję o nawie factorial_l. Nazwa funkcji pochodzi od nazwy programu z pliku definicji protokołu. Dodany do niej przyrostek _1 oznacza numer wersji. Jak widać, funkcja factorial_l otrzymuje w parametrze nazwę hosta. Funkcja służy do uruchamiania wywołań RFC clnt_create oraz wywołania zdalnego calc_fac_l. Warto zwrócić uwagę na to, że na początku procedury znalazły się prawidłowe definicje typów argumentów oraz typu wartości zwracanej przez funkcję. Domyślnie argument nettype dla wywołania systemowego clnt_create został zdefiniowany jako netpath (a nie vis ible, jak w poprzednim przykładzie). Po wywołaniu zdalnej funkcji cal_fac_l następuje sprawdzenie zwracanej przez nią wartości. Jeśli wartość ta jest równa NULL, funkcja biblioteczna clnt_perror wyświetli stosowny komunikat o błędzie (patrz tabela 9.8).
Do wywołania systemowego dnt_perror przekazuje się uchwyt klienta otrzymany z funkcji clnt_create oraz napis z informacjami. Funkcja wyświetli komunikat o błędzie połączony z przekazanym jej napisem, oddzielonym dwukropkiem.
W wygenerowanym kodzie znalazło się również wywołanie funkcji bibliotecznej clnt_de-stroy (patrz tabela 9.9). Funkcja ta umożliwia zwrócenie systemowi zasobów zarezerwowanych przez dnt_create.
Jak można oczekiwać, raz zniszczony uchwyt RPC staje się niezdefiniowany i nie można go więcej używać jako odsyłacza.
Aby ułatwić testowanie, program rpcgen w pliku szablonu umieścił szereg dyrektyw preprocesora. Wydaje się jednak, że przeoczył on fakt, iż wywołanie systemowe clnt_perior wymaga włączenia biblioteki sieciowej i dlatego powinno być umieszczone w komentarzu podczas testowania i uruchamiania aplikacji. Jak w poprzednim przykładzie, jeżeli skorzystamy z opcji -C, a wywołanie zdalnej funkcji wyliczającej potęgę (calc_fac_l) ma zostać wykonane w trybie uruchamiania i testowania, to do nazwy funkcji należy dopisać _svc, a argument clnt rzutować na typ danych (svć_req *).
Pliki włączane |
<rpc/rpc.h> |
Rozdział podręcznika |
3N | |
Prototyp |
void clnt_perror(const CLIENT *clnt, const char *s); | |||
Zwracana wartość |
Sukces |
Niepowodzenie |
Czy zmienia errno | |
Wyświetl komunikat na standardowe wyjście błędów |
Nie |
271