24

24



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.

Tabela 9.11. Zestawienie informacji o funkcji getrpcbyname

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.

Tabela 9.12. Zestawienie informacji o funkcji taddr2uaddr

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.

Ilustracja 9.35. Wynik działania programu broad.c szukującego informacji o usłudze walld

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


Wyszukiwarka

Podobne podstrony:
Komunikacja między procesami w Unixie_ ■    Jeżeli klient wysunie kilka identycznych
Komunikacja między procesami w Unixie powinno się używać w odniesieniu do poleceń, które nie prowadz
Komunikacja między procesami w Unixiedo naszych badań wybierzemy tylko nieliczne. Zestawienie argume
Komunikacja między procesami w Unixie i argv. W sekcji deklaracyjnej klienta rezerwowane jest miejsc
Komunikacja między procesami w Unixie Jeżeli proces zostanie uruchomiony lokalnie, zostanie również
Komunikacja między procesami w Unixie int * print_hello_l(void *argp, CLIENT *clnt) { static int
Komunikacja między procesami w Unixie (svc_req *) Client);    Wywołać funkcję
Komunikacja między procesami w Unixie    _ rzone przez rpcgen. Plik f act_client. c t
Komunikacja między procesami w UnixieTabela 9.9. Zestawienie informacji o funkcji clnt_destroy Pli
Komunikacja między procesami w Unixie łinclude "fact.h" long
Komunikacja między procesami w Unixie morpheus % factclient morpheus Program do wyliczania silni&nbs
Komunikacja między procesami w Unixie typedef linę *line_ptr; /* wskaźnik na "dużo miejsca"
Komunikacja między procesami w Unixie jest ustawiany na 1 (TRUE). Jeżeli bufor wynikowy został wcześ
Komunikacja między procesami w UnUieTabela 9.10. Zestawienie informacji o funkcji rpc_broadcast Pl
image001 6. Uzupełnić tabelę nazwami mechanizmów komunikacji między procesami w taki sposób, żeby wł
DSC00273 (6) 6. Uzupełnić tabelę nazwami mechanizmów komunikacji między procesami w taki sposób, żeb
DSC00277 (9) 6. Uzupełnić tabelę nazwami mechanizmów komunikacji między procesami w taki sposób, żeb
1 Komunikacja między procesami w UnixleĆwiczenie 8-8 Czy wynik działania programu 8.6 pozostanie tak

więcej podobnych podstron