NW 20 - 接続を閉じる: OpenTransport (96 年 3 月 4 日)
Q: OpenTransport のクライアント・プログラムを書いているのですが、T_ORDREL メッセージを受け取ったときに、順番にリリースを実行する方法がよくわかりません。
T_ORDREL メッセージを取得したときに、RcvOrderlyDisconnect を呼び出せばいいということは想像がつきます。でも、RcvOrderlyDisconnect のマニュアルによれば、データの送信を続けることができるが、データを読み込むと、outState エラーが発生すると書かれています。
これは本当なのですか。
A: そのとおりです。この混乱の原因は、OpenTransport というより、むしろ XTI プログラミングのダイナミズムと難解さにあります。
順番に接続の解除を行う状況で、2 つのノードが TCP 接続を確立しているとしましょう。終端 A は、データの送信が終了し、SndOrderlyDisconnect 呼び出し (ネットワークを経由した FIN (end-of-file) 信号の送信に変換されます) を実行して、接続の閉鎖を示します。
終端 B は、T_ORDREL メッセージを受信します。しかし、B がデータの受信を終了していない場合は、kOTNoDataErr を受け取るまで、Rcv の呼び出しを繰り返す必要があります。kOTNoDataErr を受け取った時点で、B は RcvOrderlyDisconnect を初期化します (A の FIN を承認します)。
これが、"半閉鎖 (half-close)" と呼ばれる状態です。B は、まだ Snd を呼び出して、A にデータを送信することができますが (T_DATA イベントを受信します)、A が送信を行おうとすると、out-of-state Error を受信します。
データの受信を終了すると、B は SndOrderlyDisconnect を初期化する必要があります。この結果、A に FIN 信号が送信されます。A でも、kOTNoDataError を受信するまでデータの取得を継続しているはずなので、RcvOrderlyDisconnect を呼び出します。これによって、リンクは解除され、両方の終端を切り離すことができます。
しかし、いずれかの終端のネットワーク・コードが、T_ORDREL イベントと T_DATA イベントを異なる優先順位で処理するように書かれていると (たとえば、T_ORDREL は通知時に処理されるが、T_DATA の処理はシステムのタスク時間まで遅延される)、競合状態が発生する場合があります。開発するプログラムでは、RcvOrderlyDisconnect を呼び出す前に、すべてのデータの読み込みを完了するように書いておく必要があります。
また、すでにご存じのように、XTI プログラミングの難解さという問題もあります。XTI プログラミングでは、SndOrderlyDisconnect または RcvOrderlyDisconnect の戻り値が TLOOK エラーになることがあります。これは、別のイベントが保留中になっていることを意味します。このため、プログラムでは、OTLook を呼び出して、そのイベントを収集する必要があります。
XTI の仕様 ("Section 4.6 Events and TLOOK Error indication") に従うと、T_DISCONNECT イベントが保留されていると、SndOrderlyDisconnect と RcvOrderlyDisconnect の呼び出しを正常に実行できません。このイベントは、その終端の接続が中断されていることを知らせるものです。このイベントは非同期ネットワークで発生することがあり、プログラムでは、RcvDisconnect を呼び出して、終端が中断していることを承認する必要があります。
OTI の仕様書を調べてみるのもいいでしょう。必ずしも明解でない部分もありますが、この仕様書には OpenTransport プログラミングに関する重要な情報が含まれています。
参考文献
タイトル: X/OPEN TRANSPORT INTERFACE (XTI) VER 2 [ 1.0 ed]
著者: X/OPEN
ISBN #: 0133534596
[ Technical Q&A's : Communications & Collaboration : Networking : NW20 ]
|