使用 XDR 分配内存

XDR 例程不仅执行输入和输出,还执行内存分配。 请考虑以下 XDR 例程 xdr_chararr1,它处理具有长度的固定字节数组SIZE.


xdr_chararr1 (xdrsp, chararr)
     XDR *xdrsp;
     char chararr[];
{
      char *p;
      int len;
   
      p = chararr;
      len = SIZE;
      return (xdr_bytes (xdrsp, &p, &len, SIZE));
}
如果已在其中分配空间,那么可以从服务器调用 chararr 。 例如:

char chararr [SIZE];
svc_getargs (transp, xdr_chararr1, chararr);
如果您希望 XDR 执行分配,那么需要通过以下方式重写此例程:

xdr_chararr2 (xdrsp, chararrp)
     XDR *xdrsp;
     char **chararrp;
{
      int len;
   
      len = SIZE;
      return (xdr_bytes (xdrsp, charrarrp, &len, SIZE));
}
那么 RPC 调用可能如下所示:

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

可以使用 svc_freeargs 宏释放字符数组。 此操作不会尝试释放变量中的任何内存,这指示变量为空。

每个 XDR 例程负责序列化,反序列化和释放内存。 从 callrpc 例程调用 XDR 例程时,将使用序列化部分。 从 svc_getargs 例程调用 XDR 例程时,将使用反序列化器。 从 svc_freeargs 例程调用 XDR 例程时,将使用内存释放程序。