MC_RECEIVE_AND_POST
MC_RECEIVE_AND_POST動詞は、アプリケーション データと状態情報を非同期的に受信します。 これにより、ローカル・トランザクション・プログラム (TP) は、データがまだローカル論理装置 (LU) に到着している間に処理を続行できます。
非同期 MC_RECEIVE_AND_POST は未処理ですが、同じ会話で次の動詞を発行できます。
-
これにより、アプリケーションは非同期 MC_RECEIVE_AND_POST を使用してデータを受信できます。 MC_RECEIVE_AND_POSTは未処理ですが、MC_SEND_ERRORとREQUEST_TO_SENDを引き続き使用できます。 完全な非同期サポートには、この機能を使用することをお勧めします。 TP がデータを受け取る方法と、この動詞の使用方法については、このトピックの「備考」を参照してください。
次の構造体は、 MC_RECEIVE_AND_POST 動詞で使用される動詞制御ブロック (VCB) について説明します。
構文
struct mc_receive_and_post {
unsigned short opcode;
unsigned char opext;
unsigned char reserv2;
unsigned short primary_rc;
unsigned long secondary_rc;
unsigned char tp_id[8];
unsigned long conv_id;
unsigned short what_rcvd;
unsigned char rtn_status;
unsigned char reserv4;
unsigned char rts_rcvd;
unsigned char reserv5;
unsigned short max_len;
unsigned short dlen;
unsigned char FAR * dptr;
unsigned char FAR * sema;
unsigned char reserv6;
};
メンバー
opcode
指定されたパラメーター。 動詞の操作コード (AP_M_RECEIVE_AND_POST) を指定します。
opext
指定されたパラメーター。 動詞操作拡張機能AP_MAPPED_CONVERSATIONを指定します。
reserv2
予約済みフィールド。
primary_rc
返されたパラメーター。 動詞の完了時に APPC によって設定されるプライマリ リターン コードを指定します。 有効なリターン コードは、発行された APPC 動詞によって異なります。 この動詞の有効なエラーコードについては、「リターン コード」を参照してください。
secondary_rc
返されたパラメーター。 動詞の完了時に APPC によって設定されるセカンダリ リターン コードを指定します。 有効なリターン コードは、発行された APPC 動詞によって異なります。 この動詞の有効なエラーコードについては、「リターン コード」を参照してください。
tp_id
指定されたパラメーター。 ローカル TP を識別します。 このパラメーターの値は、呼び出し元の TP で TP_STARTED するか、呼び出された TPのRECEIVE_ALLOCATE によって返されます。
conv_id
指定されたパラメーター。 会話識別子を提供します。 このパラメーターの値は、呼び出し元の TP で MC_ALLOCATE するか、呼び出された TP でRECEIVE_ALLOCATE することによって返されます。
what_rcvd
返されたパラメーター。 データまたは会話の状態が受信されたかどうかを示します。
AP_CONFIRM_DEALLOCATEは、パートナー TP が dealloc_type をAP_SYNC_LEVEL に設定 してMC_DEALLOCATE 発行したことを示します。 MC_ALLOCATEによって確立された会話の同期レベルはAP_CONFIRM_SYNC_LEVEL。 この値を受け取ると、ローカル TP は通常 、MC_CONFIRMEDを発行します。
AP_CONFIRM_SENDは、パートナー TP が ptr_type をAP_SYNC_LEVEL に設定してMC_PREPARE_TO_RECEIVE発行したことを示します。 MC_ALLOCATEによって確立された会話の同期レベルはAP_CONFIRM_SYNC_LEVEL。 この値を受け取ると、ローカル TP は通常 、MC_CONFIRMEDを発行し、データの送信を開始します。
AP_CONFIRM_WHAT_RECEIVEDは、パートナー TP が MC_CONFIRM発行したことを示します。 この値を受け取ると、ローカル TP は通常 、MC_CONFIRMEDを発行します。
AP_DATA_COMPLETEは、 MC_RECEIVE_AND_POST、ローカル TP が完全なデータ レコードまたはデータ レコードの最後の部分を受信したことを示します。 この値を受け取ると、ローカル TP は通常 、MC_RECEIVE_AND_POST を再発行するか、別の受信動詞を発行します。 パートナー TP がより多くのデータを送信した場合、ローカル TP は新しいデータユニットの受信を開始します。 それ以外の場合、ローカル TP は状態情報を調べます。
primary_rcにAP_OKが含まれており、what_rcvdにAP_SEND、AP_CONFIRM_SEND、AP_CONFIRM_DEALLOCATE、またはAP_CONFIRM_WHAT_RECEIVEDが含まれている場合は、ローカル TP が通常実行する次のアクションについては、値の説明 (このセクションの) を参照してください。
primary_rcにAP_DEALLOC_NORMALが含まれている場合、パートナー TP によって発行された MC_DEALLOCATE に応じて、会話の割り当てが解除されます。
AP_DATA_INCOMPLETEは、 MC_RECEIVE_AND_POSTの場合、ローカル TP が不完全なデータ レコードを受信したことを示します。 max_len パラメーターは、データ レコードの長さより小さい値を指定しました (レコードを読み取る最初の受信動詞でない場合は、データ レコードの残りの部分より小さい)。 この値を受け取ると、ローカル TP は通常、レコードの次 の部分を 受信するためにMC_RECEIVE_AND_POSTを再発行 (または別の受信動詞を発行) します。
AP_NONEは、TP がデータまたは会話の状態インジケーターを受信しなかったことを示します。
AP_SENDは、パートナー TP に対して、会話が RECEIVE 状態になっていることを示します。 ローカル TP の場合、会話は SEND 状態になりました。 この値を受信すると、ローカル TP は通常、 MC_SEND_DATA を使用してデータの送信を開始します。
rtn_status
指定されたパラメーター。 1 つの API 呼び出し内でデータと会話の状態インジケーターの両方を返す必要があるかどうかを示します。AP_NOでは、動詞の個別の呼び出しでインジケーターを個別に返す必要があることを指定します。
AP_YESは、両方が使用可能な場合に、インジケーターを一緒に返す必要があることを指定します。 どちらも、次の場合に返すことができます。
受信バッファーは、状態インジケーターの前にあるすべてのデータを保持するのに十分な大きさです。
データは、状態インジケーターの前の最後のデータ レコードです。
rts_rcvd
返されたパラメーター。 パートナー TP が MC_REQUEST_TO_SEND発行したかどうかを示します。AP_YESは、パートナー TP が MC_REQUEST_TO_SEND発行したことを示します。この場合、ローカル TP は会話を RECEIVE 状態に変更するよう要求します。
AP_NOは、パートナー TP が MC_REQUEST_TO_SENDを発行しなかったことを示します。
Max_len
指定されたパラメーター。 ローカル TP が受信できるデータの最大バイト数を指定します。 範囲は 0 ~ 65535 です。この値は、受信したデータを格納するバッファーの長さを超えてはなりません。 dptr のオフセットとmax_lenの値は、データ セグメントのサイズを超えてはなりません。
dlen
返されたパラメーター。 受信したデータのバイト数を指定します。 データは dptr で指定されたバッファーに格納されます。 長さが 0 の場合は、データが受信されなかったことを示します。dptr
指定されたパラメーター。 ローカル LU によって受信されたデータを格納するバッファーのアドレスを提供します。Microsoft Windows オペレーティング システムの場合、データ バッファーは静的データ領域またはグローバルに割り当てられた領域に存在できます。 データ バッファーは、この領域内に完全に収まる必要があります。
OS/2 オペレーティング システムの場合、データ バッファーは、フラグが 1 に等しい DosAllocSeg 関数によって割り当てられる、名前のない共有セグメント上に存在する必要があります。 データ バッファーは、データ セグメントに完全に収まる必要があります。
Sema
指定されたパラメーター。 非同期受信操作が完了したときに APPC がクリアするセマフォのアドレスを提供します。 sema パラメーターは、CreateEvent または OpenEvent Win32 関数を呼び出すことによって取得されるイベント ハンドルです。
リターン コード
AP_OK
プライマリ リターン コード。動詞は正常に実行されました。
rtn_statusがAP_YESされると、上記のリターン コードまたは次のいずれかのリターン コードを返すことができます。
AP_DATA_COMPLETE_SEND
主なリターン コード。これは、AP_DATA_COMPLETEとAP_SENDの組み合わせです。
AP_DATA_COMPLETE_CONFIRM_SEND
主なリターン コード。これは、AP_DATA_COMPLETEとAP_CONFIRM_SENDの組み合わせです。
AP_DATA_COMPLETE_CONFIRM
主なリターン コード。これは、AP_DATA_COMPLETEとAP_CONFIRM_WHAT_RECEIVEDの組み合わせです。
AP_DATA_COMPLETE_CONFIRM_DEALL
主なリターン コード。これは、AP_DATA_COMPLETEとAP_CONFIRM_DEALLOCATEの組み合わせです。
AP_DEALLOC_NORMAL
主なリターン コード。 dealloc_type MC_DEALLOCATE発行されたパートナー TP は、 AP_NONE として指定された会話の同期レベルをAP_FLUSHまたはAP_SYNC_LEVELに設定します。
rtn_statusがAP_YES場合は、what_rcvdも確認します。
AP_PARAMETER_CHECK
プライマリ リターン コード。パラメーター エラーのため、動詞は実行されませんでした。
AP_BAD_CONV_ID
セカンダリ リターン コード。 conv_id の値が、APPC によって割り当てられた会話識別子と一致しませんでした。
AP_BAD_TP_ID
セカンダリ リターン コード。 tp_id の値が、APPC によって割り当てられた TP 識別子と一致しませんでした。
AP_BAD_RETURN_STATUS_WITH_DATA
セカンダリ リターン コード。指定した rtn_status 値が APPC によって認識されませんでした。
AP_INVALID_DATA_SEGMENT
セカンダリ リターン コード。データ バッファーに指定された長さが、バッファーを格納するために割り当てられたセグメントより長かった。
AP_INVALID_SEMAPHORE_HANDLE
セカンダリ リターン コード。RAM セマフォまたはシステム セマフォ ハンドルのアドレスが無効です。
Note
APPC では、無効なセマフォ ハンドルをすべてトラップすることはできません。 TP によって無効な RAM セマフォ ハンドルが渡された場合、保護違反の結果が発生します。
AP_STATE_CHECK
プライマリ リターン コード。動詞は無効な状態で発行されたため、実行されませんでした。
AP_RCV_AND_POST_BAD_STATE
セカンダリ リターン コード。TP がこの動詞を発行したときに、会話が RECEIVE または SEND 状態ではなかった。
AP_RCV_AND_POST_NOT_LL_BDY
セカンダリ リターン コード。会話が SEND 状態でした。TP は開始されましたが、論理レコードの送信は完了しませんでした。
AP_CANCELED
主なリターン コード。ローカル TP によって次のいずれかの動詞が発行され、 MC_RECEIVE_AND_POSTが取り消されました。
dealloc_type を AP_ABEND に設定したMC_DEALLOCATE
これらの動詞のいずれかを発行すると、セマフォがクリアされます。
AP_ALLOCATION_ERROR
主なリターン コード。APPC が会話を割り当てませんでした。 会話の状態は RESET に設定されます。
このコードは、 MC_ALLOCATE後に発行された動詞を介して返すことができます。
AP_ALLOCATION_FAILURE_NO_RETRY
セカンダリ リターン コード。構成エラーやセッション プロトコル エラーなどの永続的な条件のため、会話を割り当てることができません。 エラーを特定するには、システム管理者がエラー ログ ファイルを調べる必要があります。 エラーが修正されるまで、割り当てを再試行しないでください。
AP_ALLOCATION_FAILURE_RETRY
セカンダリ リターン コード。リンクエラーなどの一時的な状態のため、会話を割り当てませんでした。 エラーの理由は、システム エラー ログに記録されます。 割り当てを再試行してください。
AP_CONVERSATION_TYPE_MISMATCH
セカンダリ リターン コード。パートナー LU または TP は、割り当て要求で指定された会話の種類 (基本またはマップ済み) をサポートしていません。
AP_PIP_NOT_ALLOWED
セカンダリ リターン コード。割り当て要求で PIP データが指定されましたが、パートナー TP がこのデータを必要としないか、パートナー LU でサポートされていません。
AP_PIP_NOT_SPECIFIED_CORRECTLY
セカンダリ リターン コード。パートナー TP には PIP データが必要ですが、割り当て要求で PIP データが指定されていないか、パラメーターの数が正しくありません。
AP_SECURITY_NOT_VALID
セカンダリ リターン コード。割り当て要求で指定されたユーザー識別子またはパスワードが、パートナー LU によって受け入れられなかった。
AP_SYNC_LEVEL_NOT_SUPPORTED
セカンダリ リターン コード。パートナー TP は、割り当て要求で指定された sync_level (AP_NONEまたはAP_CONFIRM_SYNC_LEVEL) をサポートしていないか、 sync_level が認識されませんでした。
AP_TP_NAME_NOT_RECOGNIZED
セカンダリ リターン コード。パートナー LU は、割り当て要求で指定された TP 名を認識しません。
AP_TRANS_PGM_NOT_AVAIL_NO_RETRY
セカンダリ リターン コード。リモート LU は、要求されたパートナー TP を開始できなかったため、割り当て要求を拒否しました。 条件は永続的です。 エラーの理由が、リモート ノードでログに記録されている可能性があります。 エラーが修正されるまで、割り当てを再試行しないでください。
AP_TRANS_PGM_NOT_AVAIL_RETRY
セカンダリ リターン コード。リモート LU は、要求されたパートナー TP を開始できなかったため、割り当て要求を拒否しました。 状態は一時的 (タイム アウトなど) である可能性があります。エラーの理由が、リモート ノードでログに記録されている可能性があります。 割り当てを再試行してください。
AP_COMM_SUBSYSTEM_ABENDED
プライマリ リターン コード。次のいずれかの条件を示します。
このメッセージ交換で使用されているノードで、ABEND が発生しました。
TP と PU 2.1 ノードの間の接続が切断されました (LAN エラー)。
TP のコンピューターの SnaBase で ABEND が発生しました。
ABEND の理由を特定するには、システム管理者がエラー ログを調べる必要があります。
AP_CONV_FAILURE_NO_RETRY
主なリターン コード。セッション プロトコル エラーなどの永続的な状態のため、会話が終了しました。 システム管理者は、システム エラー ログを調べて、エラーの原因を特定する必要があります。 エラーが修正されるまで、会話を再試行しないでください。AP_CONV_FAILURE_RETRY
主なリターン コード。一時的なエラーが発生したため、会話が終了しました。 TP を再起動して、問題が再び発生するかどうかを確認します。 その場合、システム管理者はエラー ログを調べて、エラーの原因を特定する必要があります。AP_CONVERSATION_TYPE_MIXED
主なリターン コード。TP は、基本的な会話動詞とマップされた会話動詞の両方を発行しました。 1 つの会話で発行できる型は 1 つだけです。AP_INVALID_VERB_SEGMENT
プライマリ リターン コード。VCB がデータ セグメントの終わりを越えています。AP_PROG_ERROR_NO_TRUNC
主なリターン コード。会話が SEND 状態の間 にMC_SEND_ERROR 発行されたパートナー TP。 データは切り捨てられませんでした。AP_PROG_ERROR_PURGING
プライマリ リターン コード。RECEIVE、PENDING、PENDING_POST、CONFIRM、CONFIRM_SEND、またはCONFIRM_DEALLOCATEの状態では、パートナー TP は MC_SEND_ERRORを発行します。 送信されたデータがまだ受信されていないデータは消去されます。AP_STACK_TOO_SMALL
プライマリ リターン コード。アプリケーションのスタック サイズが小さすぎて動詞を実行できません。 アプリケーションのスタック サイズを増やしてください。AP_CONV_BUSY
プライマリ リターン コード。どの会話にも、一度に 1 つの未処理の会話動詞しか存在できません。 これは、ローカル TP に複数のスレッドがあり、複数のスレッドが同じ conv_idを使用して APPC 呼び出しを発行している場合に発生する可能性があります。AP_UNEXPECTED_DOS_ERROR
プライマリ リターン コード。ローカル TP からの APPC 呼び出しの処理中に、オペレーティング システムから APPC にエラーが返されました。 オペレーティング システムのリターン コードは、secondary_rc 経由で返されます。 これは、Intel バイトスワップ順で表示されます。 問題が解決しない場合は、システム管理者に問い合わせてください。AP_DEALLOC_ABEND
プライマリ リターン コード。次のいずれかの理由で、会話の割り当てが解除されました。dealloc_type が AP_ABEND に設定された MC_DEALLOCATE 発行されたパートナー TP。
パートナー TP で異常終了が発生し、パートナー LU から MC_DEALLOCATE 要求が送信されました。
注釈
ローカル TP は、次のプロセスを通じてデータを受信します。
ローカル TP は、データの完全な単位の受信が完了するまで、受信動詞を発行します。 受信したデータは 1 つのデータ レコードです。
ローカル TP は、データの完全な単位を受信するために、受信動詞を複数回発行する必要がある場合があります。 データの完全な単位を受信した後、ローカル TP はそれを操作できます。 受信動詞は 、MC_RECEIVE_AND_POST、 MC_RECEIVE_AND_WAIT、 およびMC_RECEIVE_IMMEDIATEです。
ローカル TP は、受信動詞を再度発行します。 これには、次のいずれかの効果があります。
パートナー TP がより多くのデータを送信した場合、ローカル TP は新しいデータユニットの受信を開始します。
パートナー TP がデータの送信を完了した場合、または確認を待機している場合は、状態情報 ( what_rcvdを通じて使用可能) は、ローカル TP が通常実行する次のアクションを示します。
次の手順は、 MC_RECEIVE_AND_POST を使用してローカル TP によって実行されるタスクを示しています。
MC_RECEIVE_AND_POSTを使用するには
Windows オペレーティング システムの場合、TP は RegisterWindowMessage API を呼び出すか、セマフォを割り当てることによって WinAsyncAPPC メッセージ番号を取得します。 アプリケーションが Windows メッセージ メカニズムを介して通知されることを想定している場合は、 sema フィールドを NULL に設定する必要があります。
APPC は、ローカル TP がデータの受信を完了したときに、Windows メッセージを送信するか、セマフォをクリアします。
OS/2 オペレーティング システムの場合、TP は DosSemSet 関数を使用して sema が指すセマフォを設定します。
セマフォは、ローカル TP がデータを非同期的に受信する間も設定されたままになります。 ローカル TP がデータの受信を完了すると、APPC によってセマフォがクリアされます。
TP の問題 MC_RECEIVE_AND_POST。
TP は 、primary_rcの値を確認します。
primary_rcがAP_OK場合、受信バッファー (dptr が指す) は、パートナー TP から非同期的にデータを受信します。 非同期的にデータを受信している間、ローカル TP は次のことができます。
この会話に関連しないタスクを実行します。
GET_TYPE、MC_GET_ATTRIBUTES、またはMC_TEST_RTSを発行して、この会話に関する情報を収集します。
dealloc_typeがAP_ABENDに設定されたMC_DEALLOCATEを発行して、MC_RECEIVE_AND_POSTを途中で取り消す。MC_SEND_ERROR;または TP_ENDED。
ただし、 primary_rc がAP_OKされていない場合、 MC_RECEIVE_AND_POST は失敗しました。 この場合、ローカル TP は次の 2 つのタスクを実行しません。
Windows オペレーティング システムの場合、TP が非同期的にデータの受信を終了すると、APPC は WinAsyncAPPC Windows メッセージを発行するか、セマフォをクリアします。
OS/2 オペレーティング システムの場合、TP は DosSemWait 関数を使用して、APPC が sema によって指すセマフォをクリアするまで待機します。 TP が非同期的にデータの受信を完了すると、APPC はセマフォをクリアします。 ローカル TP が待機しないようにするには、APPC がセマフォをクリアするまでセマフォをテストします (タイムアウトを 0 に設定して DosSemWait を呼び出します)。
TP は 、primary_rcの新しい値を確認します。
primary_rcがAP_OK場合、ローカル TP は、返される他のパラメーターを調べて、非同期で受信したデータを操作できます。
primary_rcがAP_OKされていない場合は、secondary_rcとrts_rcvd (受信した要求から送信) のみが意味を持ちます。
会話状態の影響
TP がこの動詞を発行する場合、会話は RECEIVE または SEND 状態である必要があります。
メッセージ交換が SEND 状態の間に MC_RECEIVE_AND_POST を発行すると、次の効果があります。
ローカル LU は、送信バッファー内の情報と SEND インジケーターをパートナー TP に送信します。
会話がPENDING_POST状態に変わります。ローカル TP は、パートナー TP から非同期的に情報を受信する準備ができています。
会話の状態が 2 回変更されます。
動詞が最初に戻ると、 primary_rcに AP_OKが含まれている場合、会話はPENDING_POST状態に変わります。
動詞が完了すると、次の値に応じて状態が変わります。
primary_rc パラメーター
primary_rcがAP_OKされている場合のwhat_rcvd パラメーター
次の表は、primary_rcがAP_OKされたときのwhat_rcvdの各値に関連付けられている新しい状態を示しています。
what_rcvd | 新しい状態 |
---|---|
AP_CONFIRM_DEALLOCATE | CONFIRM_DEALLOCATE |
AP_DATA_COMPLETE_CONFIRM_DEALL | CONFIRM_DEALLOCATE |
AP_DATA_CONFIRM_DEALLOCATE | CONFIRM_DEALLOCATE |
AP_CONFIRM_SEND | CONFIRM_SEND |
AP_DATA_COMPLETE_CONFIRM_SEND | CONFIRM_SEND |
AP_DATA_CONFIRM_SEND | CONFIRM_SEND |
AP_CONFIRM_WHAT_RECEIVED | CONFIRM |
AP_DATA_COMPLETE_CONFIRM | CONFIRM |
AP_DATA_CONFIRM | CONFIRM |
AP_DATA | RECEIVE |
AP_DATA_COMPLETE | RECEIVE |
AP_DATA_INCOMPLETE | RECEIVE |
AP_SEND | SEND |
AP_DATA_COMPLETE_SEND | SEND_PENDING |
次の表は、AP_OK以外の primary_rc の各値に関連付けられている新しい状態を示しています。
primary_rc | 新しい状態 |
---|---|
AP_CANCELED | 変更なし |
AP_CONV_FAILURE_RETRY | RESET |
AP_CONV_FAILURE_NO_RETRY | RESET |
AP_DEALLOC_ABEND | RESET |
AP_DEALLOC_ABEND_PROG | RESET |
AP_DEALLOC_ABEND_SVC | RESET |
AP_DEALLOC_ABEND_TIMER | RESET |
AP_DEALLOC_NORMAL | RESET |
AP_PROG_ERROR_PURGING | RECEIVE |
AP_PROG_ERROR_NO_TRUNC | RECEIVE |
AP_SVC_ERROR_PURGING | RECEIVE |
AP_SVC_ERROR_NO_TRUNC | RECEIVE |
AP_PROG_ERROR_TRUNC | RECEIVE |
AP_SVC_ERROR_TRUNC | RECEIVE |