トランスポートのユーザーはデータ転送を行う前に XTI/TLI エンドポイントの初期化を行う必要があります。まず t_open(3NSL) を使用して適切なコネクションレスサービスプロバイダを選択し、t_bind(3NSL) を使用してその識別アドレスを確定します。
プロトコルオプションのネゴシエーションには t_optmgmt(3NSL) を使用します。コネクションモードサービス同様、各トランスポートプロバイダがサポートされているオプションを任意に指定します。オプションのネゴシエーションはプロトコル固有の処理です。例 3-1 はサーバーが着信クエリーの待ち状態から、その後、処理、応答を行う例です。例ではサーバーの定義および初期化シーケンスのコードも見ることができます。
#include <stdio.h>
#include <fcntl.h>
#include <xti.h> /* TLI アプリケーションは <tiuser.h> を使用*/
#define SRV_ADDR 2 /* サーバーの既知アドレス*/
main()
{
int fd;
int flags;
struct t_bind *bind;
struct t_unitdata *ud;
struct t_uderr *uderr;
extern int t_errno;
if ((fd = t_open("/dev/exmp", O_RDWR, (struct t_info *) NULL))
== -1) {
t_error("unable to open /dev/exmp");
exit(1);
}
if ((bind = (struct t_bind *)t_alloc(fd, T_BIND, T_ADDR))
== (struct t_bind *) NULL) {
t_error("t_alloc of t_bind structure failed");
exit(2);
}
bind->addr.len = sizeof(int);
*(int *)bind->addr.buf = SRV_ADDR;
bind->qlen = 0;
if (t_bind(fd, bind, bind) == -1) {
t_error("t_bind failed");
exit(3);
}
/*
* TLI インタフェースアプリケーションでは以下のコードが必要です。
* XTI アプリケーションでは必要ありません。
*------------------------------------------------------------
* バインドされたアドレスの検査
*
* if (bind -> addr.len != sizeof(int) ||
* *(int *)bind->addr.buf != SRV_ADDR) {
* fprintf(stderr, "t_bind bound wrong address¥n");
* exit(4);
* }
* ---------------------------------------
*/
サーバーは t_open(3NSL) を使用して、任意のトランスポートプロバイダとのトランスポートエンドポイントを確立します。各プロバイダには関連付けられたサービスタイプがあるため、ユーザーは適切なトランスポートプロバイダファイルを開くことにより特定のサービスを選択できます。このコネクションレスモードサーバーは 3 つ目の引数を NULL に設定すると t_open(3NSL) により返されるプロバイダの特性を無視します。トランザクションサーバーはトランスポートプロバイダが以下の特性を持っていると判断します。
トランスポートアドレスは整数値であり各ユーザー固有のものである。
トランスポートプロバイダは T_CLTS サービスタイプをサポートしている (コネクションレストランスポートサービスまたはデータグラム)。
トランスポートプロバイダはプロトコル固有オプションを必要としない。
コネクションレスサーバーはアクセスの可能性のあるすべてのクライアントがサーバーにアクセスできるようエンドポイントにトランスポートアドレスをバインドします。t_alloc(3NSL) により t_bind 構造体が割り当てられ、アドレスの buf および len フィールドが設定されます。
コネクションモードサーバーとコネクションレスモードサーバーの違いの 1 つは、コネクションレスモードサービスの場合は t_bind 構造体の qlen フィールドが 0 であるという点です。待機状態の接続要求が存在しないということです。
XLI/TLI インタフェースはコネクションモードサービス内でトランスポートコネクションの確立を行いながら 2 ユーザー間において固有のクライアントサーバー関係を定義します。このような関係はコネクションレスモードサービスでは存在しません。
TLI では t_bind(3NSL) より返されるバインドされたアドレスが指定されているアドレスと同一であることを保証するため、サーバーによるアドレスのチェックを必要としています。また要求されたアドレスがビジーの場合、t_bind(3NSL) はエンドポイントに、個別の使用されていないアドレスをバインドすることが可能です。