データ転送中のいかなる場合でもいずれかのユーザーがトランスポート接続を解放し会話を終了させることが可能です。
最初の方法の放棄型解放は、ただちに接続を切断し、宛先ユーザーへ配信されていないデータを破棄します。
どちらのユーザーも放棄型解放を行うために t_snddis(3NSL) を呼び出すことが可能です。XTI/TLI で問題が発生した場合は、トランスポートプロバイダによる接続の中止も可能です。t_snddis(3NSL) は接続の中止時に、ユーザーから遠隔ユーザーへのデータの送信を可能としています。放棄型解放はすべてのトランスポートプロバイダによりサポートされています。接続の中止時にデータを送信する機能は、すべてのトランスポートプロバイダではサポートされていません。
遠隔ユーザーが接続中止を通知された段階で、切断要求を受けるためには t_rcvdis(3NSL) を呼び出します。呼び出しにより接続が切断された原因を識別するコードおよび、切断要求ととも送られたデータを戻します (切断要求が遠隔ユーザーによって行われた場合) 。原因コードが基本的なプロトコル固有のものであり、プロトコルに依存しないソフトウェアによる判断は行うべきではありません。
2 つ目の方法の正常型解放では、データが失われないよう接続を終了させます。すべてのプロバイダは放棄型解放をサポートしていなければなりませんが、正常型解放はすべてのコネクション型プロトコルにサポートされているオプションではありません。
正常型解放をサポートするトランスポートの選択については 「トランスポート選択」を参照してください。
この例は、トランスポートプロバイダが正常型解放をサポートしていることを前提としています。すべてのデータがサーバーによって送信された時点で接続は以下のように解放されます。
if (t_sndrel(conn_fd) == -1) { t_error("t_sndrel failed"); exit(27); } pause(); /*正常型解放の要求が着信するまで*/
正常型解放は各ユーザーによる 2 段階の処理を必要とします。サーバーは t_sndrel(3NSL) を呼び出すことが可能です。このルーチンは接続の切断要求を送ります。クライアントが要求を受信した場合、引き続きデータをサーバーに送ることが可能です。すべてのデータが送られた時点で、クライアントは t_sndrel(3NSL) を呼び出し接続の切断要求を送り返します。接続は両方のユーザーが切り離し要求を受け取ってから解放されます。
この例で、データはサーバーからクライアントへのみ送信されます。そのためサーバーが解放に着手したあとにクライアントからデータを受信する場合の決まりはありません。サーバーは解放に着手した後、pause(2) を呼び出します。
クライアントは正常型解放により応答し、connrelease() により検知されるシグナルを生成します。(例 3-7 で、サーバーは ioctl(2) の I_SETSIG を受信イベントに対しシグナルを生成するために使用)。この状態で発生する可能性のある XTI/TLI イベントは切断要求、または正常型解放のため、connrelease は正常型解放要求が着信した時点で通常通り終了します。connrelease の exit(2) がトランスポートエンドポイントを閉じ、バインドされたアドレスの解放を行います。終了を行わずにトランスポートエンドポイントを閉じる場合、t_close(3NSL) を呼び出します。
クライアントは、サーバーが接続を解放するのと同様に解放を行います。クライアントは t_rcv(3NSL) が失敗するまで受信データの処理を行います。サーバーが接続を解放した場合 (t_snddis(3NSL) または t_sndrel(3NSL) を使用した場合)、t_rcv(3NSL) は失敗し、 t_errno を TLOOK に設定します。その後クライアントは以下の方法で接続の解放を処理します。
if ((t_errno == TLOOK) && (t_look(fd) == T_ORDREL)) { if (t_rcvrel(fd) == -1) { t_error("t_rcvrel failed"); exit(6); } if (t_sndrel(fd) == -1) { t_error("t_sndrel failed"); exit(7); } exit(0); }
クライアントのトランスポートエンドポイント上の各イベントは正常型解放要求のチェックが行われます。正常型解放の要求が見つかった場合、クライアントは要求の処理を行うために t_rcvrel(3NSL) と、解放要求の応答を送るため t_sndrel(3NSL) を呼び出します。その後クライアントは終了し、トランスポートエンドポイントを閉じます。
トランスポートプロバイダが正常型解放をサポートしていない場合、t_snddis(3NSL) と t_rcvdis(3NSL) とともに放棄型解放を使用します。各ユーザーはデータの喪失を防ぐ手段をとる必要があります。たとえば、会話の終わりが判断できるようデータストリーム内で特殊なバイトパターンを使用します。