RPC - Beispiel für Serverfunktion:
BEISPIELE/FILESERVER/fs.x: /**************************************************/ /* Filezugriff auf fremdem System */ /* "stueckweise" Ubertragung */ /* nur ASCII-Files */ /**************************************************/ /* Anfrage nach einem Abschnitt (Zeile) des Files */ struct uebertrage { char filename[100]; int ab_position; }; /* bereitgestellter Abschnitt (Zeile) des Files */ struct zeile { char zeile[1024]; int ende_kz; /* bzw. Laenge der Zeile */ }; program FS { version FSVERS { zeile TRANSPORT(uebertrage) = 2; } = 1; } = 0x2ccddee0;
BEISPIELE/FILESERVER/fserver.c: #include <stdio.h> #include <rpc/rpc.h> #include "fs.h" #include <sys/stat.h> struct zeile *transport_1(a,cl) CLIENT *cl; struct uebertrage *a; { static struct zeile ze; FILE *fpi; char line[300]; char filename[100]; int position; struct uebertrage abschnitt; abschnitt=*a; strcpy(filename,abschnitt.filename); fpi=fopen(filename,"r"); if(fpi == NULL) { ze.ende_kz=-2; return(&ze); } position=abschnitt.ab_position; fseek(fpi,(long) position,SEEK_SET); if((fgets(line,300,fpi)) == 0) { ze.ende_kz=0; fclose(fpi); return(&ze); } fclose(fpi); strcpy(ze.zeile,line); ze.ende_kz=position+strlen(line); return(&ze); }
BEISPIELE/FILESERVER/fclient.c: #include <stdio.h> #include <rpc/rpc.h> #include "fs.h" char server[] = "odoaker.hrz.tu-chemnitz.de"; main (argc,argv) int argc; char **argv; { CLIENT *cl; struct timeval tv; int z; struct uebertrage *ab, abschnitt; struct zeile *ze, zeile; cl = clnt_create (server, FS, FSVERS, "tcp"); if (cl == NULL) { clnt_pcreateerror (server); fprintf(stderr,"Fileserver %s ist z.Z. nicht erreichbar!\n", server); exit (1); } tv.tv_sec=300; tv.tv_usec=0; clnt_control(cl,CLSET_TIMEOUT,&tv); z=0; zeile.ende_kz = 1; while (zeile.ende_kz != 0) { abschnitt.ab_position=z; strncpy(abschnitt.filename,argv[1],99); ab = &abschnitt; ze = transport_1(ab, cl); if (ze == NULL) { clnt_perror (cl, server); exit (1); } zeile=*ze; if(zeile.ende_kz < 0) { fprintf(stderr, "File %s \nkann auf Server %s \nnicht gelesen werden\n", argv[1], server); exit(zeile.ende_kz*(-1)); } if(zeile.ende_kz > 0) { printf("%s",zeile.zeile); z = zeile.ende_kz; } } }