ユーザーが接続中に受信したデータの処理を行うために、既存のプログラム上 (たとえば /usr/bin/cat など) で exec(2) を使用してトランスポート接続の確立を行いたい場合があります。既存のプログラムは read(2) および write(2) を使用します。XTI/TLI は直接トランスポートプロバイダへの読み取り/書き込みインタフェースをサポートしていないものの、これを行うことが可能です。インタフェースはトランスポート接続上のデータ転送フェーズ内で read(2) および write(2) 呼び出しを可能としています。このセクションでは XTI/TLI のコネクションモードサービスへの読み取り/書き込みインタフェースについて説明しています。このインタフェースはコネクションレスモードサービスでは使用できません。
読み取り/書き込みインタフェースは 「コネクションモードサービス」のクライアント例を (変更を加えた形で) 使い説明しています。クライアントはデータ転送フェーズの段階までは同一の処理を行います。そこからクライアントは読み取り/書き込みインタフェースと cat(1) を受信データの処理に使用します。cat(1) はトランスポート接続上で変更なしに実行されます。例 3-3 のクライアントとこのクライアントの相違点のみを例 3-8 に示します。
#include <stropts.h> . ./* 同一のローカル管理および接続確立手順 */ . if (ioctl(fd, I_PUSH, "tirdwr") == -1) { perror("I_PUSH of tirdwr failed"); exit(5); } close(0); dup(fd); execl("/usr/bin/cat", "/usr/bin/cat", (char *) 0); perror("exec of /usr/bin/cat failed"); exit(6); }
クライアントは tirdwr をトランスポートエンドポイントに関連付けられたストリーム内にプッシュすることにより読み取り/書き込みインタフェースを呼び出します。streamio(7I) の I_PUSH を参照してください。tirdwr はトランスポートプロバイダより上位に位置する XTI/TLI を純粋な読み取り/書き込みインタフェースに変換します。モジュールが設置された段階で、クライアントはトランスポートエンドポイントを標準入力ファイルとして確立するために close(2) および dup(2) を呼び出し、入力の処理を行うために /usr/bin/cat を使用します。
トランスポートプロバイダへ tirdwr をプッシュすることにより、XTI/TLI は変更されます。read(2) および write(2) の意味論が使用されなければならず、メッセージ境界の保持は行われなくなります。tirdwr は XTI/TLI 意味論を復元するためにトランスポートプロバイダからポップすることが可能です (streamio(7I) の I_POP を参照)。
トランスポートエンドポイントがデータ転送フェーズ中にある場合のみ tirdwr モジュールをストリーム上にプッシュすることが可能です。モジュールがプッシュされたあとは、ユーザーは XLI/TLI のルーチンを呼び出すことはできません。XTI/TLI ルーチンが呼び出された場合、tirdwr はストリーム上に重大なプロトコルエラー EPROTO を生成し、使用不可であることを通知します。さらに tirdwr モジュールをストリーム上からポップした場合、トランスポート接続は中止されます (streamio(7I) の I_POP を参照)。
write(2) を使用しトランスポート接続へデータを送信します。tirdwr はデータをトランスポートプロバイダへ通過させます。メカニズム上は許可されているゼロ長データパケットを送った場合、tirdwr はメッセージを破棄します。トランスポート接続が、たとえば、遠隔ユーザーが接続を t_snddis(3NSL) を使用したため中止された場合、ストリーム上にハングアップ状態が生成され、それ以降の write(2) 呼び出しは失敗し、errno は ENXIO に設定されます。ハングアップ後も入手可能なデータの取り出しは可能です。
read(2) を使用し、トランスポート接続にてデータを受信します。tirdwr はデータをトランスポートプロバイダから通過させます。プロバイダからユーザーへ渡されるその他のイベント、または要求は tirdwr によって以下の通り処理されます。
read(2) はユーザーへ送られる優先データの識別は行えません。優先データ要求を受信した場合、tirdwr はストリーム上に重大なプロトコルエラー EPROTO を生成します。エラーはその後に続くシステム呼び出しを失敗に終わらせます。read(2) を 優先データの受信に使用しないでください。
tirdwr は放棄型の切断要求を破棄し、ストリーム上にハングアップ状態を生成します。後続の read(2) 呼び出しは残りのデータの回収を行い、それ以降の呼び出しに対しては 0 を戻します (ファイルの終わりを伝える)。
tirdwr は正常型の切断要求を破棄し、ユーザーへゼロ長のメッセージを配信します。read(2) で説明されているのと同様、0 を戻すことによりユーザーにメッセージの終了を通知します。
その他の XTI/TLI 要求が受信された場合、tirdwr はストリーム上に重大なプロトコルエラー EPROTO を生成します。エラーはその後に続くシステム呼び出しを失敗に終わらせます。接続が確立された後にユーザーがストリーム上に tirdwr のプッシュを行った場合、要求は生成されません。
ストリーム上に tirdwr が存在する場合、接続が行われている間、トランスポート接続上でデータの送受信が可能です。どちらのユーザーも、トランスポートエンドポイントに関連付けられたファイル記述子を閉じることにより、またはストリーム上から tirdwr モジュールをポップさせることにより接続を終了させることが可能です。いずれの場合においても tirdwr は以下の処理を行います。
正常型解放要求が事前に tirdwr により受信されている場合、正常型解放を行うため要求はトランスポートプロバイダに渡されます。正常型解放手続きを発した遠隔ユーザーはデータ転送が完了した時点で要求していた結果を受け取ります。
tirdwr によって事前に接続の切断要求が受信されている場合、特別な処置は行われません。
正常型解放要求も接続の切断要求も事前に tirdwr によって受信されていない場合、接続を中止するためトランスポートプロバイダへ切断要求が渡されます。
ストリーム上で事前にエラーが発生し、接続の切断要求が tirdwr によって受信されていない場合、トランスポートプロバイダへは切断要求が渡されます。
プロセスは tirdwr がストリーム上にプッシュされてから正常型解放を行うことはできません。tirdwr はトランスポート接続の反対側のユーザーによって正常型解放が発行された場合のみ解放を受け付けます。このセクションのクライアントが 「コネクションモードサービス」のサーバープログラムと交信を行った場合、サーバーは正常型解放の要求によりデータの転送を終了します。その後サーバーはクライアントからの次の要求を待ちます。その時点でクライアントは終了し、トランスポートエンドポイントは閉じられます。ファイル記述子が閉じられると、tirdwr は接続のクライアント側からの正常解放型要求を発行します。これによりサーバーがブロックされている要求を生成します。
TCP など、プロトコルによってはデータが完全形で配信されるよう、この正常型解放を必要とするものがあります。