Do spisu tresci tematu 9

9.2.5. Gniazda i RPC - Rozglaszanie (clnt_broadcast)


Dzialanie

Na stronie tej omieszczony jest opis dzialania funkcji 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 serwera 
Gdzie 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.

Bibliografia

  1. Biblioteka LIBC, pliki: ./rpc/*
  2. R. Stevens: ,,Programowanie zastosowan sieciowych''
  3. M. Gabbasi, B. Dupouy: ,,Przetwarzanie rozproszone w systemie UNIX''


Autor: Pawel Glebocki