Komunikacja między procesami w Uninie
Semantyka i zastosowania pliku netconfig wykraczają poza ramy tej książki1. Wystarczy rzec, iż dostępna jest rodzina protokołów oznaczonych literą „v" (visible). Ponieważ plik jest przeglądany sekwencyjnie, na tym hoście protokół udp będzie wybrany wtedy, gdy do funkcji clnt_create zostanie przekazany ciąg visible. Jeżeli potrzebny jest protokół niezawodny, ciąg visible należy zastąpić wyrazem tcp.
*
ł Plik konfiguracyjny "NetWork Configuration". ł
ł Ktżda pozycja ma postać: ł
ł <identyfikator_sieci> <semantyka> <znaczniki> <rodzina_protokołów> \ ł
ł <nazwa_protokołu> <urządzenie> <biblioteki_nazwa_na_adr> ł
udp tcpip.so |
tpi_clts |
V |
inet |
udp |
/dev/udp |
switch.so, |
tcp tcpip.so |
tpl_cots_ord |
V |
inet |
tcp |
/dev/tcp |
switch.so. |
rawip tcpip.so |
tpl_raw |
inet |
/dev/rawip |
switch.so. | ||
ticlts |
tpl_clts |
V |
loopback |
- |
/dev/ticlts |
straddr.so |
ticotsord |
tpl_cots_ord |
V |
loopback |
- |
/dev/ticotsord |
straddr.sp |
nsp |
tpl_cots_ord |
- |
decnet |
nsp |
/dev/nsp |
straddr.so |
ticots |
tpl_cots |
V |
loopback |
- |
/dev/ticots |
straddr.so |
Funkcja clnt_create zakończona błędem zwraca wartość NULL. Jeśli do tego dojdzie, jak już wspomniano, zostanie uruchomiona procedura clnt_pcreateern>r, która wyświetla komunikat o zaistniałym błędzie (patrz tabela 9.6).
Pliki włączane |
<rpc/rpc.h> |
Rozdział podręcznika |
3N | |
Prototyp |
void clnt_pcreateerror(const char *s); | |||
Zwracana wartość |
Sukces |
Niepowodzenie |
Czy zmienia errno | |
Prześlij do standardowego wyjścia błędów komunikat o błędzie powstałym podczas tworzenia RrC |
Nie |
1 Więcej informacji na temat pliku netconfig znajduje się w rozdziale 4 podręcznika
Komunikat o błędzie wygenerowany przez clnt_pcreateenor, który informuje, dlaczego tworzenie klienta się nie powiodło, zostanie dopisany do ciągu przekazanego jako jedyny argument clnt_pcreatenor (patrz tabela 9.7). Ciąg pobrany z argumentu funkcji i ciąg komunikatu o błędzie będą rozdzielone dwukropkiem, a cały tekst zakończony znakiem nowej linii. Aby uzyskać większą kontrolę nad komunikatami o błędach procesu, należy skorzystać z innej funkcji bibliotecznej, clnt_spcreateerror (const char *s), zwracającej kod błędu, który można wkomponować we własne komunikaty o błędach. Źródłem informacji o przyczynie błędu może być pole cf stat struktury rpc_createerr, które można odczytywać bezpośrednio.
Z programu klienta wyeliminowano prototyp funkcji print_hello, przenosząc go do pliku hello. h. W wywołaniu funkcji print_hello wykorzystana jest nowa nazwa: print_hel-lo_l. Funkq'a zwraca teraz wskaźnik na liczbę całkowitą (a nie samą liczbę całkowitą) i ma dwa argumenty (a wcześniej nie miała żadnego). Za sprawą swej konstrukcji wszystkie funkcje RPC zwracają wskaźniki. Generalnie każdy ich argument jest przekazywany przez referencję, a nie przez wartość.
Numer |
Stała Komunikat otrzymywany za pomocą funkcji clnt pcreateerror |
Przyczyna | |
13 |
RPCJJNKNOWNHOST |
Unknown host (nieznany host) |
Nie można znaleźć wskazanego hosta |
17 |
RPCJJNKNOWNPROTO |
Unknown protocol (nieznany protokół) |
Protokół określony argumentem nettype nie został odnaleziony albo jest błędny |
19 |
RPC_UNKNOWNADDR |
Remote seryer address unknown (nieznany adres zdalnego serwera) |
Nie można rozwikłać adresu zdalnego serwera |
21 |
RPC.NOBROADCAST |
Broadcast not supported (rozsyłanie nie obsługiwane) |
System nie pozwala na rozsyłanie komunikatów (wysyłanie komuni- |
katów do wszystkich demonów rpcbind w sieci)
Ponieważ ta funkq'a początkowo nie miała parametrów, użyto identyfikatora filier jako szablonu wstawiania. Drugi argument print_hello_l, Client, jest wskaźnikiem do struktury klienta zwróconej przez wywołanie clnt create.
Serwer, który teraz znajduje się w tym samym pliku co hello_server. c, został pokazany w programie 9.4.
/*
* Program-SERWER: hello_server.c
* Ten kod będzie wykonywany przez proces mzdalny"
V
tinclude <stdio.h>
261