ユーザーがコネクション中に受信したデータを処理するために、既存のプログラム上 (/usr/bin/cat など) で exec(2) を使用してトランスポートコネクションを確立したいとします。既存のプログラムは read(2) および write(2) を使用します。XTI/TLI は直接トランスポートプロバイダへの読み取りインタフェースと書き込みインタフェースをサポートしていませんが、これを処理することが可能です。このインタフェースを使用すると、データ転送フェーズにおいて read(2) および write(2) 呼び出しをトランスポートコネクション上で実行できます。このセクションでは XTI/TLI のコネクションモードサービスへの読み取りインタフェースと書き込みインタフェースについて説明しています。なおこのインタフェースはコネクションレスモードサービスでは使用できません。
#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) の意味論を使用するようになります。read および write の意味論を使用するとき、XTI/TLI はメッセージ境界を保持しません。トランスポートプロバイダから tirdwr をポップすると、XTI/TLI は本来の意味論に戻ります (streamio(7I) のマニュアルページの I_POP を参照)。
tirdwr モジュールをストリーム上にプッシュできるのは、トランスポート終端がデータ転送フェーズ中にある場合だけです。モジュールをプッシュしたあと、ユーザーは XLI/TLI ルーチンを呼び出すことはできません。ユーザーが XTI/TLI ルーチンを呼び出した場合、tirdwr はストリーム上に重大なプロトコルエラー EPROTO を生成し、使用不可であることを通知します。このとき、tirdwr モジュールをストリーム上からポップすると、トランスポートコネクションは中止されます。詳細については、streamio(7I) のマニュアルページの I_POP を参照してください。
write(2) を使用してトランスポートコネクションにデータを送信したあと、tirdwr はトランスポートプロバイダを通じてデータを渡します。メカニズム上は許可されていますが、ゼロ長のデータパケットを送った場合、tirdwr はメッセージを破棄します。トランスポートコネクションが中止された場合、ハングアップ状態がストリーム上に生成され、それ以降の write(2) 呼び出しは失敗し、errno は ENXIO に設定されます。この問題が発生するのは、たとえば、リモートユーザーが t_snddis(3NSL) を使用してコネクションを中止した場合があります。ハングアップ後も利用できるデータの取り出しは可能です。
トランスポートコネクションに着信したデータを読み取るには、read(2) を使用します。tirdwr はトランスポートプロバイダからデータを渡します。tirdwr モジュールは、トランスポートプロバイダからユーザーに渡されるその他のイベントまたは要求を次のように処理します。
read(2) はユーザーへ送られる優先データを識別できません。read(2) が優先データ要求を受信した場合、tirdwr はストリーム上に重大なプロトコルエラー EPROTO を生成します。このエラーが発生すると、後続のシステムコールは失敗します。優先データを受信するときには、read(2) を使用しないでください。
tirdwr は放棄型の切断要求を破棄し、ストリーム上にハングアップ状態を生成します。後続の read(2) 呼び出しには残りのデータを返し、すべてのデータを返した後の呼び出しにはファイルの終わりを示す 0 を返します。
tirdwr は正常型解放要求を破棄し、ゼロ長のメッセージをユーザーに配信します。read(2) のマニュアルページで説明するようにファイルの終わりを示す 0 をユーザーに返します 。
read(2) がその他の XTI/TLI 要求を受信した場合、tirdwr はストリーム上に重大なプロトコルエラー EPROTO を生成します。このエラーが発生すると、後続のシステムコールは失敗します。コネクションを確立したあと、ユーザーが tirdwr をストリーム上にプッシュした場合、tirdwr は要求を生成しません。
ストリーム上に tirdwr が存在する場合、コネクションの間はトランスポートコネクション上でデータの送受信が可能です。どちらのユーザーも、トランスポート終端に関連付けられたファイル記述子を閉じることにより、またはストリーム上から tirdwr モジュールをポップさせることによりコネクションを終了させることが可能です。どちらの場合も tirdwr は次の処理を行います。
正常型解放要求を受信した場合、tirdwr は要求をトランスポートプロバイダに渡してコネクションを正常に解放します。データ転送が完了すると、正常型解放手続きを実行したリモートユーザーは期待される結果を受信します。
切断要求を受信した場合、tirdwr は特別な処理を行いません。
正常型解放要求または切断要求のどちらも受信しない場合、tirdwr は切断要求をトランスポートプロバイダに渡してコネクションを中止します。
ストリーム上でエラーが発生したときに切断要求を受信しない場合、tirdwr は切断要求をトランスポートプロバイダに渡します。
tirdwr をストリーム上にプッシュしたあと、プロセスは正常型解放を実行できません。トランスポートコネクションの相手側のユーザーが解放を実行した場合、tirdwr は正常型解放を処理します。このセクションのクライアントがサーバープログラムと通信している場合、サーバーは正常型解放要求を使用してデータの転送を終了します。次に、サーバーはクライアントからの対応する要求を待ちます。この時点でクライアントは、トランスポート終端を終了して閉じます。ファイル記述子を閉じたあと、tirdwr はコネクションのクライアント側から正常解放型要求を実行します。この解放によって、サーバーをブロックする要求が生成されます。
データがそのままで配信されることを保証するために、この正常型解放を必要とするTCP などのプロトコルもあります。