Skip to main content

TCP に関するその他のトピック

ここでは、TCP/IP を使用した InterSystems IRIS® データ・プラットフォーム・プロセス間の通信に関するその他のトピックについて説明します。

接続管理

サーバは、一度に 1 つの接続のみ維持できます。したがって、あるクライアントがサーバに接続しているときに 2 番目のクライアントが接続しようとすると、TCP/IP はそのクライアントをキューに格納します。2 番目のクライアントはキューの間、あたかも接続されているかのように、ポートに書き込むことができます。2 番目のクライアントが書き込むデータは、最初の接続が閉じ、2 番目のクライアントに接続するまでバッファに維持されます。

接続が構築される前に READ を発行すると、2 番目のクライアントは停止します。2 番目の接続がキューに入っている間に、3 番目のクライアントが接続を試行しても、その接続は失敗します。

最初の接続がまだ存在しているときに、TCP デバイスを既に開いているクライアントが、2 回目の接続を試行した場合、2 回目の OPEN コマンドでは <COMMAND> エラーが発生します。この状況を USE コマンドではなくエラーとして処理することで、予想できない結果を予防します。例えば、誤ったプログラムが新規に接続を開いたと判断した場合でも、実際には異なる宛先あるいは異なるパラメータを持つ既存の接続を再利用しているたけであると、予測不可能な結果が生じる場合があります。

複数のクライアントを処理する方法は、以下を参照してください。

TCP デバイスを使用した JOB コマンド

JOB コマンドを使用して、TCP 並行サーバ を実装することができます。TCP 並行サーバを使用すると、複数のクライアントを同時に処理できます。このモードでは、クライアントは、サーバが他のクライアント処理を終了するまで待機する必要はありません。代わりに、クライアントがサーバに要求を送信するたびに、開いているクライアントに対して必要に応じて個別のサブジョブを生成します。このサブジョブが生成された直後に (JOB コマンドから制御が戻ります)、他のクライアントが処理を要求することがあります。サーバは、そのクライアントのサブジョブも同様に生成します。

非並行モードおよび並行モードのクライアント/サーバ接続
非並行 : 一度に 1 つのクライアント/サーバ。並行 : クライアント/サーバ、サーバによるジョブの生成、クライアントによるサーバの解放、ジョブの実行。

並行サーバは、switch 並行サーバ・ビット (ビット 4 またはビット 16) を設定した JOB コマンドを使用します。お勧めの設定はビット 16 です。

  • ビット 4 が設定されている場合、JOB コマンドは、生成したプロセスに、principal input および principal output のプロセス・パラメータの TCP デバイスを渡します。switch にビット 4 が含まれている場合、常に、プロセス・パラメータ principal input および principal output の両方の TCP デバイスを指定する必要があります。また、principal input および principal output の両方に同じデバイスを使用する必要があります。ビット 4 の使用はお勧めしません。詳細は、"ObjectScript リファレンス" の "JOB" コマンドを参照してください。

  • ビット 16 が設定されている場合、JOB コマンドは、生成したプロセスに、TCP デバイス、principal input プロセス・パラメータ、および principal output プロセス・パラメータの 3 つの異なるデバイスを渡します。principal input プロセス・パラメータと principal output プロセス・パラメータを使用して、JOB コマンドでこれらの TCP デバイスのうち 2 つを指定します。以下の例に示すように、これらのパラメータを既定に設定することも可能です。JOB child:(:16:input:output) または JOB child:(:16::))

例および詳細は、"ObjectScript リファレンス" の "JOB" コマンドを参照してください。

JOB コマンドを実行する前に、principal input および principal output に指定するデバイスは、以下の状態になる必要があります。

  • 接続されている

  • TCP ポートで待ち受け状態にある

  • 接続を受け入れ済みである

JOB コマンドの後、生成されているプロセスのデバイスは継続して TCP ポートで待ち受け状態にありますが、アクティブな接続は既に存在していません。アプリケーションは、JOB コマンドの実行後に $ZA を確認し、TCP デバイスの状態で CONNECTED ビットがリセットされていることを確認する必要があります。

生成されたプロセスは、指定の TCP デバイスを使用して指定のエントリ・ポイントで開始します。子プロセスの TCP デバイス名は、親プロセスの名前と同じです。TCP デバイスには、付属のソケットが 1 つあります。継承された TCP デバイスは、S (ストリーム) モードです。しかし、子プロセスは、USE コマンドでモードを変更できます。サーバは、TCP デバイスを A (受信) モードで開くことをお勧めします。

生成したプロセスにある TCP デバイスは、接続状態です。これは、デバイスをクライアントから開いた後に受け取る状態と同じです。生成されたプロセスは、TCP デバイスを USE 0 あるいは USE $P で使用します。TCP デバイスを暗黙的に使用することもできます (switch=4 の場合)。ただし、以下の理由により switch=16 が switch=4 よりも優先されます。

  • switch=4 の場合、<READ> エラーが主デバイス上で発生すると、エラー・トラップをせず、ジョブは単に停止します。これは、switch=4 の場合、TCP デバイスが主デバイスであるためです。エラー・トラップをサポートするには、switch=16 を使用し、TCP デバイスに別のデバイスを指定します。

  • switch=4 の場合、リモート TCP デバイスが接続を終了すると、エラー・トラップをせず、ジョブは単に停止します。この既定の動作をオーバーライドし、<DSCON> エラーを生成するには、%SYSTEM.ProcessOpens in a new tab クラスの DisconnectErr()Opens in a new tab メソッドを設定する必要があります。

JOB コマンドではなく %SYSTEM.SocketOpens in a new tab クラス・メソッドを使用して並行 TCP サーバ接続を作成できます。ただし、%SYSTEM.SocketOpens in a new tab メソッドはワーカ・ジョブが既に開始されていることを想定していることに注意してください。ワーカ・ジョブを開始するためにリスナ・ジョブが不要な場合、並行 TCP サーバ接続にこれらのメソッドを使用できます。リスナ・ジョブはワーカ・ジョブのプロセス ID (PID) を認識しています。

レコードの連結

特定の環境で、TCP は、別々のレコードを 1 つのレコードに連結します。クライアントあるいはサーバ・プロセスが、バッファをフラッシュするために WRITE ! あるいは WRITE # コマンドで区切られた一連の WRITE コマンドを TCP ポートに発行した場合、READ コマンドが他の接続の切断を待機しているかどうかにかかわらず、レコードの連結が可能です。

最初の例は、Process B が TCP ポートに 2 つのレコードを書き込む間、READ コマンドを持つ Process A がどのように 2 つのレコードを受信するのかを説明しています。

Process A                            Process B
%SYS> USE "|TCP|41880" R A U 0 W A   %SYS> USE "|TCP|41880" WRITE "ONE",!,"TWO"
<RETURN>                             <RETURN>
ONE
%SYS> USE 41880 R A U 0 W A 
<RETURN>
TWO

2 番目の例は、Process B が TCP ポートに 2 つのレコードを記述し、その後、READ コマンドを発行した Process A がどのように 1 つの連結レコードを受信するのかを説明しています。

Process A                           Process B
.                                   %SYS> USE "|TCP|41880" WRITE "ONE",!,"TWO"
.                                   <RETURN>
ONE
%SYS> USE "/TCP/41880" R A U 0 W A 
<RETURN>
ONETWO

InterSystems IRIS TCP デバイスの多重化

%SYSTEM.SocketOpens in a new tab クラスは InterSystems IRIS TCP デバイスの多重化のためのメソッドを提供します。Fork() および Select() メソッドにより、新規接続の受け入れ、および接続した TCP デバイスからのデータ読み取りを両方同時に処理する単一ジョブが可能になります。待ち受け TCP デバイスが接続を受け入れた後に、Fork()Opens in a new tab を使用して、データ読み取りのための新規 TCP デバイスを作成します。元の待ち受け TCP デバイスは着信接続の受け入れを続行します。Select()Opens in a new tab メソッドを使用して、待ち受けおよび接続した TCP デバイスの両方に対して待機を行います。新規接続が着信するか、またはデータが使用可能になった場合、Select() は信号を受けたデバイス名を返します。

Select()Opens in a new tabPublish()Opens in a new tabExport()Opens in a new tab、および Import()Opens in a new tab メソッドを使用すれば、リスナ・ジョブの着信接続受入れとワーカ・ジョブへの接続デバイス受け渡しが可能になります。このワーカ・ジョブはリモート・クライアントとの通信が可能となっています。

詳細およびプログラム例については、"インターシステムズ・クラス・リファレンス" の "%SYSTEM.SocketOpens in a new tab" クラスを参照してください。

関連項目

FeedbackOpens in a new tab