プロトコルによっては、サーバーからクライアントにハンドルが渡され、クライアントは後からハンドルをサーバーに送り返します。クライアントではハンドルの内容を調べることはなく、受け取ったものをそのまま送り返します。すなわち、ハンドルは隠されたデータ (内容が隠されたデータ) です。固定長の隠されたデータを記述するには、xdr_opaque() プリミティブを使用します。
bool_t xdr_opaque(xdrs, p, len) XDR *xdrs; char *p; u_int len; |
引数 p は隠されたオブジェクトのアドレスを、 len は隠されたオブジェクト内のバイト数を示します。隠されたデータの定義からすると、実際に隠れたオブジェクトに入っているデータはマシン間で移植不可能です。
SunOS/SVR4 システムには、隠されたデータの操作用にもう 1 つのルーチンが提供されています。そのルーチン xdr_netobj は xdr_opaque() と同様にカウント付きの隠されたデータを送信します。次のコーディング例は xdr_netobj() の構文を示します。
struct netobj { u_int n_len; char *n_bytes; }; typedef struct netobj netobj; bool_t xdr_netobj(xdrs, np) XDR *xdrs; struct netobj *np; |
xdr_netobj() はフィルタプリミティブで、可変長の隠されたデータとその外部表現との変換を行います。引数 np は netobj 構造体のアドレスです。netobj 構造体には隠されたデータの長さと隠されたデータへのポインタが入っています。 長さは、MAX_NETOBJ_SZ バイトを超えることはできません。変換に成功すれば TRUE、失敗すれば FALSE が返されます。