使用 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 例程时,将使用内存释放程序。