Navigation

3.3.10 Filezugriff auf Remote Host

Ablauf eines RPC-Aufrufes:
  1. Anstoß durch Client-Programm: Parameter werden in ein Datenpaket verpackt (laut RPC- und XDR-Protokoll)
  2. Versand des Auftrages und Auspacken der Parameter im Server-Programm
  3. Durchführung des Auftrages (d.h. Abarbeitung der eigentlichen Funktion)
  4. Verpacken und Versand der Resultate
  5. Auspacken der Resultate im Client
diese Aufgaben realisieren Bibliotheksfunktionen, die in das Server- bzw. Clientprogramm eingebunden werden Beispiel einer Definitionsdatei:

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;

RPC - Beispiel für Serverfunktion:

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);
}

RPC - Beispiel für Clientfunktion:

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;
    }
  }
}

Navigation