MC_RECEIVE_AND_POST
Le verbe MC_RECEIVE_AND_POST reçoit les données d’application et status informations de manière asynchrone. Cela permet au programme de transaction local (TP) de poursuivre le traitement pendant que les données arrivent toujours à l’unité logique locale (LU).
Bien qu’une MC_RECEIVE_AND_POST asynchrone soit en suspens, les verbes suivants peuvent être émis sur la même conversation :
-
Cela permet à une application d’utiliser une MC_RECEIVE_AND_POST asynchrone pour recevoir des données. Bien que le MC_RECEIVE_AND_POST soit exceptionnel, il peut toujours utiliser MC_SEND_ERROR et REQUEST_TO_SEND. Il est recommandé d’utiliser cette fonctionnalité pour une prise en charge asynchrone complète. Pour plus d’informations sur la façon dont un TP reçoit des données et sur l’utilisation de ce verbe, consultez Remarques dans cette rubrique.
La structure suivante décrit le bloc de contrôle de verbe (VCB) utilisé par le verbe MC_RECEIVE_AND_POST .
Syntaxe
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;
};
Membres
opcode
Paramètre fourni. Spécifie le code d’opération de verbe, AP_M_RECEIVE_AND_POST.
opext
Paramètre fourni. Spécifie l’extension d’opération de verbe, AP_MAPPED_CONVERSATION.
reserv2
Champ réservé.
primary_rc
Paramètre retourné. Spécifie le code de retour principal défini par APPC à l’achèvement du verbe. Les codes de retour valides dépendent du verbe APPC émis. Pour connaître les codes d’erreur valides de ce verbe, consultez Codes de retour.
secondary_rc
Paramètre retourné. Spécifie le code de retour secondaire défini par APPC à l’achèvement du verbe. Les codes de retour valides dépendent du verbe APPC émis. Pour connaître les codes d’erreur valides de ce verbe, consultez Codes de retour.
tp_id
Paramètre fourni. Identifie le TP local. La valeur de ce paramètre est retournée par TP_STARTED dans le TP appelant ou parRECEIVE_ALLOCATE dans le TP appelé.
conv_id
Paramètre fourni. Fournit l’identificateur de conversation. La valeur de ce paramètre est retournée par MC_ALLOCATE dans le TP appelant ou par RECEIVE_ALLOCATE dans le TP appelé.
what_rcvd
Paramètre retourné. Indique si des données ou des status de conversation ont été reçus.
AP_CONFIRM_DEALLOCATE indique que le tp partenaire a émis des MC_DEALLOCATE avec dealloc_type défini sur AP_SYNC_LEVEL. Le niveau de synchronisation de la conversation, établi par MC_ALLOCATE, est AP_CONFIRM_SYNC_LEVEL. Lors de la réception de cette valeur, le TP local émet normalement MC_CONFIRMED.
AP_CONFIRM_SEND indique que le tp partenaire a émis des MC_PREPARE_TO_RECEIVE avec ptr_type défini sur AP_SYNC_LEVEL. Le niveau de synchronisation de la conversation, établi par MC_ALLOCATE, est AP_CONFIRM_SYNC_LEVEL. À la réception de cette valeur, le TP local émet normalement MC_CONFIRMED et commence à envoyer des données.
AP_CONFIRM_WHAT_RECEIVED indique que le tp partenaire a émis des MC_CONFIRM. Lors de la réception de cette valeur, le TP local émet normalement MC_CONFIRMED.
AP_DATA_COMPLETE indique, pour MC_RECEIVE_AND_POST, que le TP local a reçu un enregistrement de données complet ou la dernière partie d’un enregistrement de données. Lors de la réception de cette valeur, le TP local réédite normalement MC_RECEIVE_AND_POST ou émet un autre verbe de réception. Si le TP partenaire a envoyé plus de données, le TP local commence à recevoir une nouvelle unité de données. Sinon, le TP local examine status informations.
Si primary_rc contient AP_OK et what_rcvd contient AP_SEND, AP_CONFIRM_SEND, AP_CONFIRM_DEALLOCATE ou AP_CONFIRM_WHAT_RECEIVED, consultez la description de la valeur (dans cette section) pour l’action suivante que le TP local effectue normalement.
Si primary_rc contient AP_DEALLOC_NORMAL, la conversation a été libérée en réponse aux MC_DEALLOCATE émises par le tp partenaire.
AP_DATA_INCOMPLETE indique, pour MC_RECEIVE_AND_POST, que le TP local a reçu un enregistrement de données incomplet. Le paramètre max_len a spécifié une valeur inférieure à la longueur de l’enregistrement de données (ou inférieure au reste de l’enregistrement de données si ce n’est pas le premier verbe de réception à lire l’enregistrement). Lors de la réception de cette valeur, le TP local réédite normalement MC_RECEIVE_AND_POST (ou émet un autre verbe de réception) pour recevoir la partie suivante de l’enregistrement.
AP_NONE indique que le TP n’a pas reçu de données ou d’indicateurs de status de conversation.
AP_SEND indique, pour le TP partenaire, que la conversation est entrée dans l’état RECEIVE. Pour le TP local, la conversation est maintenant à l’état SEND. Lors de la réception de cette valeur, le TP local utilise normalement MC_SEND_DATA pour commencer à envoyer des données.
rtn_status
Paramètre fourni. Indique si les indicateurs de status de données et de conversation doivent être retournés dans un appel d’API.AP_NO spécifie que les indicateurs doivent être retournés individuellement sur des appels distincts du verbe.
AP_YES spécifie que les indicateurs doivent être retournés ensemble, à condition que les deux soient disponibles. Les deux peuvent être retournés dans les cas suivants :
La mémoire tampon de réception est suffisamment grande pour contenir toutes les données qui précèdent l’indicateur status.
Les données sont le dernier enregistrement de données avant l’indicateur status.
rts_rcvd
Paramètre retourné. Indique si le TP partenaire a émis MC_REQUEST_TO_SEND.AP_YES indique que le tp partenaire a émis MC_REQUEST_TO_SEND, qui demande au TP local de modifier la conversation à l’état RECEIVE.
AP_NO indique que le tp partenaire n’a pas émis de MC_REQUEST_TO_SEND.
Max_len
Paramètre fourni. Spécifie le nombre maximal d’octets de données que le TP local peut recevoir. La plage est comprise entre 0 et 65535.La valeur ne doit pas dépasser la longueur de la mémoire tampon pour contenir les données reçues. Le décalage de dptr plus la valeur de max_len ne doit pas dépasser la taille du segment de données.
dlen
Paramètre retourné. Spécifie le nombre d’octets de données reçus. Les données sont stockées dans la mémoire tampon spécifiée par dptr. Une longueur de zéro indique qu’aucune donnée n’a été reçue.Dpt
Paramètre fourni. Fournit l’adresse de la mémoire tampon pour contenir les données reçues par la lu locale.Pour le système d’exploitation Microsoft Windows, la mémoire tampon de données peut résider dans une zone de données statique ou dans une zone allouée globalement. La mémoire tampon de données doit s’adapter entièrement à cette zone.
Pour le système d’exploitation OS/2, la mémoire tampon de données doit résider sur un segment partagé sans nom, qui est alloué par la fonction DosAllocSeg avec des indicateurs égaux à 1. La mémoire tampon de données doit s’adapter entièrement au segment de données.
Sema
Paramètre fourni. Fournit l’adresse du sémaphore qu’APPC doit effacer lorsque l’opération de réception asynchrone est terminée. Le paramètre sema est un handle d’événement obtenu en appelant la fonction CreateEvent ou OpenEvent Win32.
Codes de retour
AP_OK
Code de retour principal ; indique que le verbe s’est exécuté correctement.
Lorsque rtn_status est AP_YES, le code de retour précédent ou l’un des codes de retour suivants peut être retourné.
AP_DATA_COMPLETE_SEND
Code de retour principal ; il s’agit d’une combinaison de AP_DATA_COMPLETE et de AP_SEND.
AP_DATA_COMPLETE_CONFIRM_SEND
Code de retour principal ; il s’agit d’une combinaison de AP_DATA_COMPLETE et de AP_CONFIRM_SEND.
AP_DATA_COMPLETE_CONFIRM
Code de retour principal ; il s’agit d’une combinaison de AP_DATA_COMPLETE et de AP_CONFIRM_WHAT_RECEIVED.
AP_DATA_COMPLETE_CONFIRM_DEALL
Code de retour principal ; il s’agit d’une combinaison de AP_DATA_COMPLETE et de AP_CONFIRM_DEALLOCATE.
AP_DEALLOC_NORMAL
Code de retour principal ; le tp partenaire a émis MC_DEALLOCATE avec dealloc_type défini sur AP_FLUSH ou AP_SYNC_LEVEL avec le niveau de synchronisation de la conversation spécifié comme AP_NONE.
Si rtn_status est AP_YES, examinez également what_rcvd .
AP_PARAMETER_CHECK
Code de retour principal ; le verbe n’a pas été exécuté en raison d’une erreur de paramètre.
AP_BAD_CONV_ID
Code de retour secondaire ; la valeur de conv_id ne correspondait pas à un identificateur de conversation attribué par APPC.
AP_BAD_TP_ID
Code de retour secondaire ; la valeur de tp_id ne correspondait pas à un identificateur TP attribué par APPC.
AP_BAD_RETURN_STATUS_WITH_DATA
Code de retour secondaire ; la valeur rtn_status spécifiée n’a pas été reconnue par APPC.
AP_INVALID_DATA_SEGMENT
Code de retour secondaire ; la longueur spécifiée pour la mémoire tampon de données était plus longue que le segment alloué pour contenir la mémoire tampon.
AP_INVALID_SEMAPHORE_HANDLE
Code de retour secondaire ; l’adresse du sémaphore RAM ou du handle de sémaphore système n’était pas valide.
Notes
APPC ne peut pas intercepter tous les handles de sémaphore non valides. Si le programme transactionnel transmet un descripteur de sémaphore RAM incorrect, une violation de protection se produit.
AP_STATE_CHECK
Code de retour principal ; le verbe n’a pas été exécuté, car il a été émis dans un état non valide.
AP_RCV_AND_POST_BAD_STATE
Code de retour secondaire ; la conversation n’était pas à l’état RECEIVE ou SEND lorsque le TP a émis ce verbe.
AP_RCV_AND_POST_NOT_LL_BDY
Code de retour secondaire ; la conversation était à l’état SEND ; le TP a commencé mais n’a pas terminé l’envoi d’un enregistrement logique.
AP_CANCELED
Code de retour principal ; le TP local a émis l’un des verbes suivants, qui a annulé MC_RECEIVE_AND_POST :
MC_DEALLOCATE avec dealloc_type défini sur AP_ABEND
L’émission d’un de ces verbes entraîne l’effacement du sémaphore.
AP_ALLOCATION_ERROR
Code de retour principal ; APPC n’a pas pu allouer une conversation. L’état de la conversation est défini sur RESET.
Ce code peut être retourné par le biais d’un verbe émis après MC_ALLOCATE.
AP_ALLOCATION_FAILURE_NO_RETRY
Code de retour secondaire ; la conversation ne peut pas être allouée en raison d’une condition permanente, telle qu’une erreur de configuration ou une erreur de protocole de session. Pour déterminer l’erreur, l’administrateur système doit examiner le fichier journal des erreurs. Ne réessayez pas l’allocation tant que l’erreur n’a pas été corrigée.
AP_ALLOCATION_FAILURE_RETRY
Code de retour secondaire ; la conversation n’a pas pu être allouée en raison d’une condition temporaire, telle qu’un échec de liaison. La raison de l’échec est consignée dans le journal des erreurs système. Réessayez l’allocation.
AP_CONVERSATION_TYPE_MISMATCH
Code de retour secondaire ; l’unité lu ou tp partenaire ne prend pas en charge le type de conversation (de base ou mappé) spécifié dans la demande d’allocation.
AP_PIP_NOT_ALLOWED
Code de retour secondaire ; la demande d’allocation a spécifié des données PIP, mais soit le tp partenaire n’a pas besoin de ces données, soit l’unité lu partenaire ne les prend pas en charge.
AP_PIP_NOT_SPECIFIED_CORRECTLY
Code de retour secondaire ; le TP partenaire nécessite des données PIP, mais la demande d’allocation n’a spécifié aucune donnée PIP ou un nombre incorrect de paramètres.
AP_SECURITY_NOT_VALID
Code de retour secondaire ; l’identificateur utilisateur ou le mot de passe spécifié dans la demande d’allocation n’a pas été accepté par l’unité lu partenaire.
AP_SYNC_LEVEL_NOT_SUPPORTED
Code de retour secondaire ; le TP partenaire ne prend pas en charge les sync_level (AP_NONE ou AP_CONFIRM_SYNC_LEVEL) spécifiés dans la demande d’allocation, ou le sync_level n’a pas été reconnu.
AP_TP_NAME_NOT_RECOGNIZED
Code de retour secondaire ; l’unité lu partenaire ne reconnaît pas le nom TP spécifié dans la demande d’allocation.
AP_TRANS_PGM_NOT_AVAIL_NO_RETRY
Code de retour secondaire ; l’unité lu distante a rejeté la demande d’allocation, car elle n’a pas pu démarrer le TP du partenaire demandé. La condition est permanente. La raison de l’erreur peut être consignée sur le nœud distant. Ne réessayez pas l’allocation tant que l’erreur n’a pas été corrigée.
AP_TRANS_PGM_NOT_AVAIL_RETRY
Code de retour secondaire ; l’unité lu distante a rejeté la demande d’allocation, car elle n’a pas pu démarrer le TP du partenaire demandé. La situation peut être temporaire, par exemple un délai d’attente. La raison de l’erreur peut être consignée sur le nœud distant. Réessayez l’allocation.
AP_COMM_SUBSYSTEM_ABENDED
Code de retour principal ; indique l’une des situations suivantes :
Le nœud utilisé par cette conversation a rencontré un abandon (ABEND).
La connexion a été interrompue entre le programme transactionnel et le nœud PU 2.1 (erreur LAN).
Le processus SnaBase qui se déroule sur l’ordinateur du programme transactionnel a rencontré un abandon (ABEND).
L’administrateur système doit examiner le journal des erreurs pour déterminer la raison de l’abandon.
AP_CONV_FAILURE_NO_RETRY
Code de retour principal ; la conversation a été arrêtée en raison d’une condition permanente, telle qu’une erreur de protocole de session. L’administrateur système doit examiner le journal des erreurs système pour déterminer la cause de l’erreur. N’réessayez pas la conversation tant que l’erreur n’a pas été corrigée.AP_CONV_FAILURE_RETRY
Code de retour principal ; la conversation a été arrêtée en raison d’une erreur temporaire. Redémarrez le TP pour voir si le problème se produit à nouveau. Si c’est le cas, l’administrateur système doit examiner le journal des erreurs pour déterminer la cause de l’erreur.AP_CONVERSATION_TYPE_MIXED
Code de retour principal ; le TP a émis des verbes de conversation de base et mappés. Un seul type peut être émis dans une seule conversation.AP_INVALID_VERB_SEGMENT
Code de retour principal ; indique que le bloc de contrôle de verbe s’étend au-delà de la fin du segment de données.AP_PROG_ERROR_NO_TRUNC
Code de retour principal ; le tp partenaire a émis MC_SEND_ERROR alors que la conversation était à l’état SEND. Les données n’ont pas été tronquées.AP_PROG_ERROR_PURGING
Code de retour principal ; tandis que dans l’état RECEIVE, PENDING, PENDING_POST, CONFIRM, CONFIRM_SEND ou CONFIRM_DEALLOCATE, le tp partenaire a émis MC_SEND_ERROR. Les données envoyées mais pas encore reçues sont vidées.AP_STACK_TOO_SMALL
Code de retour principal ; indique que la taille de la pile de l’application est trop petite pour exécuter le verbe. Augmentez la taille de pile de votre application.AP_CONV_BUSY
Code de retour principal ; il ne peut y avoir qu’un seul verbe de conversation en suspens à la fois sur n’importe quelle conversation. Cela peut se produire si le tp local a plusieurs threads et que plusieurs threads émettent des appels APPC à l’aide du même conv_id.AP_UNEXPECTED_DOS_ERROR
Code de retour principal ; indique que le système d’exploitation a retourné une erreur à APPC lors du traitement d’un appel APPC à partir du programme transactionnel local. Le code de retour du système d’exploitation a été retourné via secondary_rc. Il apparaît dans l’ordre Intel avec permutation d’octets. Si le problème persiste, consultez l’administrateur système.AP_DEALLOC_ABEND
Code de retour principal ; la conversation a été libérée pour l’une des raisons suivantes :Le tp partenaire a émis MC_DEALLOCATE avec dealloc_type défini sur AP_ABEND.
Le TP partenaire a rencontré un ABEND, ce qui a entraîné l’envoi d’une requête MC_DEALLOCATE par l’unité logique du partenaire.
Remarques
Le TP local reçoit des données par le biais du processus suivant :
Le tp local émet un verbe de réception jusqu’à ce qu’il finissent de recevoir une unité complète de données. Les données reçues sont un enregistrement de données.
Le tp local peut avoir besoin d’émettre le verbe de réception plusieurs fois pour recevoir une unité complète de données. Une fois qu’une unité complète de données a été reçue, le TP local peut la manipuler. Les verbes de réception sont MC_RECEIVE_AND_POST, MC_RECEIVE_AND_WAIT et MC_RECEIVE_IMMEDIATE.
Le TP local émet à nouveau le verbe de réception. Cela a l’un des effets suivants :
Si le tp partenaire a envoyé plus de données, le TP local commence à recevoir une nouvelle unité de données.
Si le tp partenaire a terminé d’envoyer des données ou attend une confirmation, status informations (disponibles via what_rcvd) indique l’action suivante que le TP local effectue normalement.
La procédure suivante montre les tâches effectuées par le tp local dans à l’aide de MC_RECEIVE_AND_POST.
Pour utiliser MC_RECEIVE_AND_POST
Pour le système d’exploitation Windows, le tp récupère le numéro de message WinAsyncAPPC en appelant l’API RegisterWindowMessage ou en allouant un sémaphore. Le champ sema doit être défini sur NULL si l’application s’attend à être avertie par le biais du mécanisme de message Windows.
APPC envoie le message Windows ou efface le sémaphore lorsque le tp local a fini de recevoir des données.
Pour le système d’exploitation OS/2, le tp utilise la fonction DosSemSet pour définir le sémaphore pointé par semaphore.
Le sémaphore reste défini pendant que le tp local reçoit les données de façon asynchrone. APPC efface le sémaphore lorsque le tp local a fini de recevoir des données.
Le TP émet MC_RECEIVE_AND_POST.
Le TP vérifie la valeur de primary_rc.
Si primary_rc est AP_OK, la mémoire tampon de réception (pointée par dptr) reçoit de manière asynchrone des données du tp partenaire. Lors de la réception de données de façon asynchrone, le tp local peut :
Effectuer des tâches non liées à cette conversation.
Problème MC_REQUEST_TO_SEND.
Collectez des informations sur cette conversation en publiant des GET_TYPE, des MC_GET_ATTRIBUTES ou des MC_TEST_RTS.
Annulez prématurément MC_RECEIVE_AND_POST en émettant des MC_DEALLOCATE avec dealloc_type défini sur AP_ABEND ; MC_SEND_ERROR ; ou TP_ENDED.
Si, toutefois, primary_rc n’est pas AP_OK, MC_RECEIVE_AND_POST a échoué. Dans ce cas, le tp local n’effectue pas les deux tâches suivantes.
Pour le système d’exploitation Windows, lorsque le TP a fini de recevoir des données de façon asynchrone, APPC émet le message Windows WinAsyncAPPC ou efface le sémaphore.
Pour le système d’exploitation OS/2, le TP utilise la fonction DosSemWait pour attendre qu’APPC efface le sémaphore pointé par sema. Lorsque le tp a fini de recevoir des données de façon asynchrone, APPC efface le sémaphore. Pour empêcher le tp local d’attendre, faites-le tester (en appelant DosSemWait avec délai d’attente défini sur zéro) jusqu’à ce que APPC efface le sémaphore.
Le tp vérifie la nouvelle valeur de primary_rc.
Si primary_rc est AP_OK, le tp local peut examiner les autres paramètres retournés et manipuler les données reçues de manière asynchrone.
Si primary_rc n’est pas AP_OK, seuls les secondary_rc et les rts_rcvd (demande d’envoi reçues) sont significatifs.
Effets de l’état de la conversation
La conversation doit être à l’état RECEIVE ou SEND lorsque le TP émet ce verbe.
L’émission de MC_RECEIVE_AND_POST alors que la conversation est à l’état SEND a les effets suivants :
L’unité logique locale envoie les informations dans sa mémoire tampon d’envoi et un indicateur SEND au tp partenaire.
La conversation passe à l’état PENDING_POST ; le TP local est prêt à recevoir des informations du tp partenaire de manière asynchrone.
La conversation change deux fois les états :
Lors du retour initial du verbe, si primary_rc contient AP_OK, la conversation passe à l’état PENDING_POST.
Une fois le verbe terminé, l’état change en fonction de la valeur des éléments suivants :
Paramètre primary_rc
Paramètre what_rcvd si primary_rc est AP_OK
Le tableau suivant montre le nouvel état associé à chaque valeur de what_rcvd lorsque primary_rc est AP_OK.
what_rcvd | Nouvel état |
---|---|
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 | CONFIRMER |
AP_DATA_COMPLETE_CONFIRM | CONFIRMER |
AP_DATA_CONFIRM | CONFIRMER |
AP_DATA | RECEIVE |
AP_DATA_COMPLETE | RECEIVE |
AP_DATA_INCOMPLETE | RECEIVE |
AP_SEND | SEND |
AP_DATA_COMPLETE_SEND | SEND_PENDING |
Le tableau suivant montre le nouvel état associé à chaque valeur de primary_rc autre que AP_OK.
primary_rc | Nouvel état |
---|---|
AP_CANCELED | Aucun changement |
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 |