例 3-5 はクライアントの接続確立を行うためのコード例です。
if ((sndcall = (struct t_call *) t_alloc(fd, T_CALL, T_ADDR)) == (struct t_call *) NULL) { t_error("t_alloc failed"); exit(3); } /* * プロバイダのアドレスの形式を認知していると推測されるため、 * このプログラムはトランスポートに依存します。 */ sndcall->addr.len = sizeof(int); *(int *) sndcall->addr.buf = SRV_ADDR; if (t_connect( fd, sndcall, (struct t_call *) NULL) == -1 ) { t_error("t_connect failed for fd"); exit(4); }
t_connect(3NSL) 呼び出しはサーバに接続するために使用されます。t_connect(3NSL) の 1 つ目の引数は、クライアント側のエンドポイントを特定します。2 つ目の引数は、宛先サーバーを特定する t_call 構造体を指します。この構造体は以下の形式です。
struct t_call { struct netbuf addr; struct netbuf opt; struct netbuf udata; int sequence; }
addr はサーバーのアドレスを特定します。opt は接続へプロトコル固有オプションを指定します。udata はサーバーへの接続要求とともに送信可能なユーザーデータを特定します。sequence フィールドの t_connect(3NSL) における役割はありません。コーディング例ではサーバーのアドレスのみが渡されます。
t_alloc(3NSL) は t_call 構造体を動的に割り当てます。t_alloc(3NSL) の 3 つ目の引数、T_ADDR は netbuf バッファーの割り当てがシステムに必要であることを示します。サーバーのアドレスは buf にコピーされ、len は同様に適切な値に設定されます。
t_connect(3NSL) の 3 つ目の引数は、新たに確立された接続の情報を取り出すのに使用でき、サーバーによって接続要求の応答とともに送られたユーザーデータの返送が可能です。ここでは 3 つ目の引数はクライアントにより NULL に設定されています。接続は t_connect(3NSL) の応答が成功している場合に確立されます。サーバーが接続要求を拒否した場合、t_connect(3NSL) は t_errno を TLOOK に設定します。