next up previous contents
Next: C.8 Prijavljanje streznika sistemu Up: C Klicanje oddaljenih procedur Previous: C.6 Kodiranje in dekodiranje Vsebina: contents

C.7 Prevajalnik protokola RPCGEN

S programom rpcgen, ki je prilozen okolju RPC se iz posebne izvorne kode generira koda za aplikacijo streznika in odjemalca. Izvorna koda za rpcgen ima torej strukturo, ki je podobna programom ( Lex[LMB92], Yacc, Bison, Equel) z namenom konsistentnosti aplikacij streznika in odjemalca. Kot je ze bilo omenjeno, se podprogrami iz knjiznice XDR uporabljajo za kodiranje in dekodiranje podatkov, zato bi bilo neumestno, ce bi oba dela celotne aplikacije uporabljala svoje rutine za konverzijo.

S programom rpcgen tako iz izvorne kode, ki ima obicajno koncnico .x naredimo tri izvorne datoteke .c in skupno datoteko .h. Tri izvorne datoteke so:

Prevajalnik protokola ne naredi vseh rutin za aplikacijo, ampak le osnovo za komunikacijo. Seveda je mozno napisati aplikacijo tudi brez uporabe prevajalnika protokola, vendar moramo pri tem skrbno paziti na kompatibilnost med streznikom in odjemalcem. V praksi se je izkazalo, da je uporaba programa rpcgen skoraj nuja, saj se je kaj lahko zmotiti pri razvijanju programa; iskanje napak pa je pri takih aplikacijah zelo zahteven proces. Uporabnik tudi najveckrat ne predvidi vse mozne napake, ki se lahko pojavijo pri komunikaciji, rpcgen pa pri tvorjenju izvorne kode vgrajuje tudi testiranja o morebitnih napakah. Se pomembnejsi razlog pa je, da je program z uporabo rpcgen krajsi in lazje razumljiv.

Jezik prevajalnika je podoben jeziku C, poleg tega pa lahko vsebuje tudi bloke v jeziku C, ki je ne interpretira, ampak le prepise na ustrezno mesto. Prevajalnik protokola je v prvi vrsti namenjen generiranju povezovalnih rutin, zato ima v jeziku najvec moznosti prav za definiranje tipa podatkov, ki se posiljajo med streznikom in odjemalcem. Ker v knjiznici XDR ni bilo mehanizma za konverzijo sestavljenih tipov kot so strukture (struct, typedef) in unije, je eden od namenov rpcgen tudi ta, da omogoci pretvorbo struktur v osnovne tipe, ki jih poznamo v knjiznici XDR.

Iz dela, kjer so definirani podatki za transport, prevajalnik naredi izvorno kodo s filtri v posebni datoteki s koncnico _xdr.c. Programska sekcija, ki je tudi sestavni del jezika, pa omogoca pravilno povezavo med programom streznika in odjemalca. Tu opisemo procedure, ki jih bosta programa imela in podamo verzijo programa. Ena od ugodnosti aplikacij RPC je tudi ta, da na enem racunalniku lahko tece vec verzij istega programa. S tem si zagotovimo, da lahko starejsi programi se vedno delujejo ob uvedbi novejsih, praviloma testnih verzij streznikov. To je tudi eden od razlogov za priljubljenost protokola RPC, saj mnogokrat zanesljivost delovanja streznika pomemben faktor pri delu distribuiranih aplikacij.

Primer vhodne datoteke prevajalnika rpcgen za izpis imenika na serverju je:

/*
 * dir.x: Izpis imenika na serverju
 */
const MAXNAMELEN = 255;  /* Najvecja dolzina imena direktorija */
typedef string nametype<MAXNAMELEN>;    /* imenik */
typedef struct namenode *namelist;      /* povezava v seznamu */
/*
 * Vozel v seznamu direktorija
 */
struct namenode {
        nametype name;          /* ime direktorija */
        namelist next;          /* naslednje ime */
};
/*
 * Razultati branja procedure READDIR
 */
union readdir_res switch (int errno) {
case 0:
        namelist list;  /* brez napake: vrni seznam direktorija */
default:
        void;           /* napaka: vrni prazno */
};
/*
 * Definicija programa z podprogramom READDIR
 */
program DIRPROG {
        version DIRVERS {
                readdir_res
                READDIR(nametype) = 1;
        } = 1;
} = 76;

Poleg definicije protokola, je potrebno napisati se specificne podprograme, ki dejansko izvajajo delo in vracajo rezultate. Implementacija je seveda odvisna od specificnosti celotne aplikacije.



Copyright © 1995 Leon Kos, Univerza v Ljubljani