プロトコルによっては、サーバーからクライアントにハンドルが渡され、クライアントは後からハンドルをサーバーに送り返します。クライアントではハンドルの内容を調べることはなく、受け取ったものをそのまま送り返します。すなわち、ハンドルは隠されたデータ (内容が隠されたデータ) です。固定長の隠されたデータを記述するには、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() と同様にカウント付きの隠されたデータを送信します。 例 A-10 に、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 が返されます。