Zuordnen von Speicher mit XDR

XDR-Routinen machen nicht nur Eingabe und Ausgabe, sondern auch Speicherzuordnung. Betrachten Sie die folgende XDR-Routine, xdr_chararr1, die sich mit einem festen Byte-Array mit Länge befasst.SIZE.


xdr_chararr1 (xdrsp, chararr)
     XDR *xdrsp;
     char chararr[];
{
      char *p;
      int len;
   
      p = chararr;
      len = SIZE;
      return (xdr_bytes (xdrsp, &p, &len, SIZE));
}
Wenn bereits Speicherbereich zugeordnet wurde, kann chararr von einem Server aufgerufen werden. Beispiel:

char chararr [SIZE];
svc_getargs (transp, xdr_chararr1, chararr);
Wenn XDR die Zuordnung vornehmen soll, müssen Sie diese Routine wie folgt neu schreiben:

xdr_chararr2 (xdrsp, chararrp)
     XDR *xdrsp;
     char **chararrp;
{
      int len;
   
      len = SIZE;
      return (xdr_bytes (xdrsp, charrarrp, &len, SIZE));
}
Dann könnte der RPC-Aufruf wie folgt aussehen:

char *arrptr;
arrptr = NULL;
svc_getargs (transp, xdr_chararr2, &arrptr);
/*
*Use the result here
*/
svc_freeargs (transp, xdr_chararr2, &arrptr);

Das Zeichenarray kann mit dem Makro svc_freeargs freigegeben werden. Diese Operation versucht nicht, Speicher in der Variablen freizugeben, was darauf hinweist, dass die Variable null ist.

Jede XDR-Routine ist für die Serialisierung, Deserialisierung und Freigabe von Speicher verantwortlich. Wenn eine XDR-Routine von der Routine callrpc aufgerufen wird, wird der Serialisierungsabschnitt verwendet. Wenn eine XDR-Routine von der Routine svc_getargs aufgerufen wird, wird der Deserializer verwendet. Wenn eine XDR-Routine von der Routine svc_freeargs aufgerufen wird, wird die Speicherzuordnungsfunktion verwendet.