ONC+ 開発ガイド

レコード (TCP/IP) ストリーム

レコードストリームは、レコードマーク標準の上に構築される 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 は、上に説明した同名の引数と同じです。レコードストリームでは、標準入出力ストリームと同様のデータバッファリングを行います。引数 sendsizerecvsize には、それぞれ送信バッファと受信バッファのサイズ (バイト数) を指定します。この値がゼロ (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() ルーチンを呼び出すと、現在出力しているデータにレコードマークが付けられます。引数 flushnowTRUE を指定すると、ストリームの writeproc() が呼び出されます。指定しない場合は出力バッファがいっぱいになったときに writeproc() が呼び出されます。

xdrrec_skiprecord() ルーチンを呼び出すと、入力ストリーム内の現在位置が、現在レコードの境界まで移動し、ストリーム内の次のレコードの始めに位置します。

ストリームの入力バッファにデータがなくなると、xdrrec_eof() ルーチンから TRUE が返されます。ストリームの元のファイル記述子にデータがなくなったという意味ではありません。