clnt_broadcast()
enum clnt_stat
clnt_broadcast(prog,vers,proc,xargs,argsp,xresults,resultsp,aechresult)
u_long prog,vers,proc /* numer programu,wersji,procedury
xdrproc_t xargs,xresults /* filtry xdr do obslugi danych nadawanych
/* i przyjmowanych
resultproc_t eachresult /* funkcja wywolywana automatycznie dla
/* kazdego otrzymanego wyniku
Funkcja na poczatku wypelnia strukture identyfikacyjna AUTH
uzywajac funkcji authunuix_create_default()
, tworzy sobie nowe
gniazdo, nastepnie ustawia na nim opcje SO_BROADCAST
. Na zmienna addr pobiera
adresy udostepnione przez serwera nazw, lub dostepne przez plik /etc/hosts, oraz
na zmienna nets wpisuje liczbe tych adresow. Wypelnia strukture baddr.sin_port
na numer portmapera, sin_family na AF_INET
... . W kolejnym kroku
wypelnia strukture msg
typu struct rpc_msg
wstawiajac odpowiednie numery programu, wersji... i ustawiajac kierunek
wiadomosci na CALL.
Przy pomocy potoku XDR "w pamieci" do lokalnego
bufora kodowane sa odpowiednio wiadomosc (msg) i argumenty wywolania procedury.
Kolejna czynnoscia jest wykonanie petli w ktorej pod kazdy uzyskany poprzednio
adres wysylamy kilkakrotnie wiadomosc zakodowana w naszym buforze i oczekujemy
na odpowiedz. O ile nie nadejdzie w odpowiednim czasie to uznajemy ze nasze
wywolanie bylo bledne i zwracamy kod bledu, wpp wywolujemy funkcje
eachresult()
, ktora zwraca nam wartosc typu bool_t czy wywolanie
zakonczylo sie sukcesem czy porazka.
bool_t eachresult(resp,raddr) caddr_t resp /*wskaznik do odpowiedzi struct sockaddr_in raddr /*adres serweraGdzie raddr jest adresem serwera ktory odpowiedzial na nasze rzadanie (jesli w ogole taka odpowiedz uzyskalismy), a resp jest wskaznikiem do odpowiedzi, ktora wyluskalismy z wiadomosci powrotnej od wyzej wymienionego serwera.
./rpc/*