ネットワークインタフェース

読み取り/書き込み用インタフェース

ユーザーが接続中に受信したデータの処理を行うために、既存のプログラム上 (たとえば /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 に示します。


例 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) 呼び出しは失敗し、errnoENXIO に設定されます。ハングアップ後も入手可能なデータの取り出しは可能です。

読み取り

read(2) を使用し、トランスポート接続にてデータを受信します。tirdwr はデータをトランスポートプロバイダから通過させます。プロバイダからユーザーへ渡されるその他のイベント、または要求は tirdwr によって以下の通り処理されます。

閉じる

ストリーム上に tirdwr が存在する場合、接続が行われている間、トランスポート接続上でデータの送受信が可能です。どちらのユーザーも、トランスポートエンドポイントに関連付けられたファイル記述子を閉じることにより、またはストリーム上から tirdwr モジュールをポップさせることにより接続を終了させることが可能です。いずれの場合においても tirdwr は以下の処理を行います。

プロセスは tirdwr がストリーム上にプッシュされてから正常型解放を行うことはできません。tirdwr はトランスポート接続の反対側のユーザーによって正常型解放が発行された場合のみ解放を受け付けます。このセクションのクライアントが 「コネクションモードサービス」のサーバープログラムと交信を行った場合、サーバーは正常型解放の要求によりデータの転送を終了します。その後サーバーはクライアントからの次の要求を待ちます。その時点でクライアントは終了し、トランスポートエンドポイントは閉じられます。ファイル記述子が閉じられると、tirdwr は接続のクライアント側からの正常解放型要求を発行します。これによりサーバーがブロックされている要求を生成します。

TCP など、プロトコルによってはデータが完全形で配信されるよう、この正常型解放を必要とするものがあります。