レコードストリームは、レコードマーク標準の上に構築される XDR ストリームです。レコードマーク標準は、UNIX ファイル、または、4.2 BSD 接続インタフェースの上に構築されます。
#include <rpc/rpc.h> /* XDR は RPC のサブセット */ xdrrec_create(xdrs, sendsize, recvsize, iohandle, readproc, writeproc) XDR *xdrs; u_int sendsize, recvsize; char *iohandle; int (*readproc)(), (*writeproc)(); |
xdrrec_create() は、任意の長さの双方向レコードシーケンスが可能な XDR ストリームインタフェースを提供します。レコードの内容は、XDR 形式のデータと考えられます。レコードストリームは、主に RPC と TCP 接続とのインタフェースとして使用されますが、通常の UNIX ファイルとのデータ入出力にも使用できます。
引数 xdrs は、これまでに説明した同名の引数と同じです。レコードストリームでは、標準入出力ストリームと同様のデータバッファリングを行います。引数 sendsize と recvsize には、それぞれ送信バッファと受信バッファのサイズ (バイト数) を指定します。この値がゼロ (0) の場合は、あらかじめ指定されたデフォルトのバッファサイズが使用されます。バッファにデータを読み込んだり、データをフラッシュしたりするときは、ルーチン readproc()または writeproc() を呼び出します。この 2 つのルーチンの使用方法と機能は、UNIXのシステムコール read() と write() に似ていますが、第 1 引数には隠されたデータ iohandle を渡します。その後の 2 つの引数 (および nbytes) と、戻り値 (バイトカウント) はシステムルーチンと同じです。次の xxx()を readproc() または writeproc() とすると、その形式は次のようになります。
/* 実際に伝送したバイト数を返す。エラーのときの戻り値は -1 */ int xxx(iohandle, buf, len) char *iohandle; char *buf; int nbytes; |
XDR ストリームには、バイトストリームのレコードを区切る方法が提供されています。XDR ストリームを作成するのに必要な抽象データ型については、「XDR ストリームの作成」を参照してください。XDRストリームレコードを区切るのに使用する RPC プロトコルについては、「レコードマーク標準」を参照してください。
レコードストリームに特有なプリミティブは以下のとおりです。
bool_t xdrrec_endofrecord(xdrs, flushnow) XDR *xdrs; bool_t flushnow; bool_t xdrrec_skiprecord(xdrs) XDR *xdrs; bool_t xdrrec_eof(xdrs) XDR *xdrs; |
xdrrec_endofrecord() ルーチンを呼び出すと、現在出力しているデータにレコードマークが付けられます。引数 flushnow に TRUE を指定すると、ストリームの writeproc() が呼び出されます。TRUE を指定しないと、出力バッファがいっぱいになったときに writeproc() が呼び出されます。
xdrrec_skiprecord() ルーチンを呼び出すと、入力ストリーム内の現在位置が、現在レコードの境界まで移動し、ストリーム内の次のレコードの始めに位置します。
ストリームの入力バッファにデータがなくなると、xdrrec_eof() ルーチンから TRUE が返されます。ストリームの元のファイル記述子にもデータが残っていないという意味ではありません。