Komunikacja między procesami w Unixie_
if (rpc_stat != RPC_SUCCESS)
if (rpc_stat !- RPC_TIM£DOUT) ( /* jeśli błąd nie polegał na */
/* przekroczeniu czasu */
fprintf(stderr, "Niepowodzenie rozsyłania: %s\n", clnt_sperrno(rpc_stat)) exit<3);
Program sprawdza liczbę argumentów linii poleceń. Oczekuje, że otrzyma nazwę (lub numer) usługi, którą ma sprawdzió, oraz numer jej wersji. Najpierw sprawdzany jest pierwszy znak pierwszego argumentu. Jeżeli jest to cyfra, zakłada się, że został przekazany numer usługi. Program podejmuje więc próbę konwersji tego numeru, mającego postać napisu, na wartość liczbową za pomocą funkcji atoi. Jeżeli przekazano nazwę usługi, wywołanie sieciowe getrpcbyname pobiera szczegółowe dane związane z usługą. Zestawienie informacji o tym wywołaniu przedstawiono w tabeli 9.11.
Pliki włączane |
< rpc/rpcent.h> |
Rozdział podręcznika |
3N | |
Prototyp |
struct rpcent ‘getrpcbyname(const char * name); | |||
Zwracana wartość |
Sukces |
Niepowodzenie |
Czy zmienia errnó | |
Wskaźnik na strukturę rpcent danej usługi |
NULL |
Nie |
Funkcja getrpcbyname ma tylko jeden parametr: wskaźnik na tablicę znaków zawierającą nazwę usługi. Wywołanie zakończone powodzeniem zwraca wskaźnik na strukturę rpcent danej usługi. Struktura rpcent jest zdefiniowana następująco:
struct rpcent {
char *r_name; /* nazwa usługi rpc */
char **r_aliases; /* zakończona zerem lista nazw */
/* alternatywnych */
long r_number; /* numer programu rpc */
} ;
Program konwertuje drugi argument linii poleceń na numer wersji. Wywołanie rpc_bro-adcast jest używane do zbierania odpowiedzi. Za każdym razem, kiedy serwer odpowiada na żądanie rozsyłania, automatycznie wywoływana jest definiowana przez użytkownika funkcja who_responded.
W funkcji tej występuje kolejne wywołanie sieciowe, taddi2uaddr. Służy ono do pozyskiwania wskaźnika na ciąg znaków zawierający adres uniwersalny respondenta. Jest to adres zapisywany zgodnie z notacją N1.N2.N3.N4.P1.P2, gdzie pierwsze cztery oktety N tworzą sieciowy numer IP, a ostatnie dwa oktety P wskazują konkretny port. Jeżeli konwersja nie jest możliwa (co nie oznacza poważnej awarii), funkcja taddrżuaddr zwraca NULL. Składnię i inne informacje o taddr2uaddr zamieszczono w tabeli 9.12.
Pliki włączane |
<rtętdir.h> |
Rozdział podręcznika |
3N | |
Prototyp |
char *taddr2uaddr< const struct netconfig ‘config, const struct netbuf *addr ); | |||
Zwracana wartość |
Sukces |
Niepowodzenie |
Czy zmienia errno | |
Wskaźnik na dąg znaków zawierający adres uniwersalny |
NULL |
Nie |
Uzyskany adres uniwersalny jest rozbijany na ciąg z adresem IP (przez umieszczenie znaku NULL w miejscu czwartej kropki) i ciąg z numerem portu, przekształcanym do postaci liczbowej. Program należy skompilować i ponieważ wykorzystano w nim wiele wywołań funkqi sieciowych skonsolidować z biblioteką sieciową (tj. -Insi). Przykładowy wynik działania programu żądającego informacji o usłudze walld w wersji 1 pokazano na ilustracji 9.35.
morpheus % broad walld 1
host |
137.49.1.22 |
port |
32820 | ||
host |
137.49.1.22 |
port |
32820 |
ten sam host. |
ten sam por' |
host |
137.49.1.98 |
port |
1536 | ||
host |
137.49.1.6 |
port |
32804 |
różne hosty, |
różne porty |
host |
137.49.1.6 |
port |
32804 | ||
host |
137.49.1.8 |
port |
1043 | ||
host |
137.49.1.3 |
port |
1043 | ||
host |
137.49.1.4 |
port |
1043 | ||
host |
137.49.1.9 |
port |
1043 |
różne hosty. |
ten sam port |
host |
137.49.1.14 |
port |
32789 |
1 | |
host |
137.49.1.14 |
port |
32789 | ||
host |
137.49.1.22 |
port |
32820 | ||
host |
137.49.1.22 |
port |
32820 |
289