MC_RECEIVE_AND_POST
Il verbo MC_RECEIVE_AND_POST riceve i dati dell'applicazione e le informazioni sullo stato in modo asincrono. Ciò consente al programma di transazione locale (TP) di procedere con l'elaborazione mentre i dati vengono ancora arrivati all'unità logica locale (LU).
Mentre un MC_RECEIVE_AND_POST asincrono è in sospeso, i verbi seguenti possono essere rilasciati nella stessa conversazione:
-
Ciò consente a un'applicazione di usare un MC_RECEIVE_AND_POST asincrono per ricevere i dati. Mentre l'MC_RECEIVE_AND_POST è in sospeso, può comunque usare MC_SEND_ERROR e REQUEST_TO_SEND. È consigliabile usare questa funzionalità per il supporto asincrono completo. Per informazioni sul modo in cui un TP riceve i dati e su come usare questo verbo, vedere Osservazioni in questo argomento.
La struttura seguente descrive il blocco di controllo verbo (VCB) usato dal verbo MC_RECEIVE_AND_POST verbo.
Sintassi
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;
};
Members
Opcode
Parametro fornito. Specifica il codice dell'operazione verbo, AP_M_RECEIVE_AND_POST.
opext
Parametro fornito. Specifica l'estensione dell'operazione verbo, AP_MAPPED_CONVERSATION.
reserv2
Campo riservato.
Primary_rc
Parametro restituito. Specifica il codice restituito primario impostato da APPC al completamento del verbo. I codici restituiti validi variano a seconda del verbo APPC rilasciato. Per questo verbo, vedere Codici restituiti per i codici di errore validi.
Secondary_rc
Parametro restituito. Specifica il codice restituito secondario impostato da APPC al completamento del verbo. I codici restituiti validi variano a seconda del verbo APPC rilasciato. Per questo verbo, vedere Codici restituiti per i codici di errore validi.
Tp_id
Parametro fornito. Identifica il TP locale. Il valore di questo parametro viene restituito da TP_STARTED nella chiamata TP o daRECEIVE_ALLOCATE nel TP richiamato.
Conv_id
Parametro fornito. Fornisce l'identificatore della conversazione. Il valore di questo parametro viene restituito da MC_ALLOCATE nella chiamata TP o da RECEIVE_ALLOCATE nel TP richiamato.
what_rcvd
Parametro restituito. Indica se i dati o lo stato della conversazione sono stati ricevuti.
AP_CONFIRM_DEALLOCATE indica che il TP partner ha rilasciato MC_DEALLOCATE con dealloc_type impostato su AP_SYNC_LEVEL . Il livello di sincronizzazione della conversazione, stabilito da MC_ALLOCATE, è AP_CONFIRM_SYNC_LEVEL. Al momento della ricezione di questo valore, il TP locale genera normalmente problemi MC_CONFIRMED.
AP_CONFIRM_SEND indica che il partner TP ha rilasciato MC_PREPARE_TO_RECEIVE con ptr_type impostato su AP_SYNC_LEVEL. Il livello di sincronizzazione della conversazione, stabilito da MC_ALLOCATE, è AP_CONFIRM_SYNC_LEVEL. Dopo aver ricevuto questo valore, il TP locale genera normalmente problemi MC_CONFIRMED e inizia a inviare dati.
AP_CONFIRM_WHAT_RECEIVED indica che il partner TP ha rilasciato MC_CONFIRM. Al momento della ricezione di questo valore, il TP locale genera normalmente problemi MC_CONFIRMED.
AP_DATA_COMPLETE indica, per MC_RECEIVE_AND_POST, che il TP locale ha ricevuto un record di dati completo o l'ultima parte di un record di dati. Al momento della ricezione di questo valore, il TP locale in genere ripubblica MC_RECEIVE_AND_POST o genera un altro verbo di ricezione. Se il TP partner ha inviato altri dati, il TP locale inizia a ricevere una nuova unità di dati. In caso contrario, il TP locale esamina le informazioni sullo stato.
Se primary_rc contiene AP_OK e what_rcvd contiene AP_SEND, AP_CONFIRM_SEND, AP_CONFIRM_DEALLOCATE o AP_CONFIRM_WHAT_RECEIVED, vedere la descrizione del valore (in questa sezione) per l'azione successiva eseguita normalmente dal TP locale.
Se primary_rc contiene AP_DEALLOC_NORMAL, la conversazione è stata deallocata in risposta alla MC_DEALLOCATE rilasciata dal partner TP.
AP_DATA_INCOMPLETE indica, per MC_RECEIVE_AND_POST, che il TP locale ha ricevuto un record di dati incompleto. Il parametro max_len ha specificato un valore minore della lunghezza del record dati (o minore del resto del record di dati se non è il primo verbo di ricezione per leggere il record). Dopo aver ricevuto questo valore, il TP locale in genere ristampa MC_RECEIVE_AND_POST (o rilascia un altro verbo di ricezione) per ricevere la parte successiva del record.
AP_NONE indica che il TP non ha ricevuto dati o indicatori di stato della conversazione.
AP_SEND indica, per il partner TP, che la conversazione ha immesso lo stato DI RICEZIONE. Per il TP locale, la conversazione è ora in stato SEND. Al momento della ricezione di questo valore, il TP locale usa normalmente MC_SEND_DATA per iniziare a inviare dati.
rtn_status
Parametro fornito. Indica se devono essere restituiti sia i dati che gli indicatori di stato della conversazione all'interno di una chiamata API.AP_NO specifica che gli indicatori devono essere restituiti singolarmente in chiamate separate del verbo.
AP_YES specifica che gli indicatori devono essere restituiti insieme, purché entrambi siano disponibili. Entrambi possono essere restituiti quando:
Il buffer di ricezione è abbastanza grande per contenere tutti i dati che precedono l'indicatore di stato.
I dati sono l'ultimo record di dati prima dell'indicatore di stato.
rts_rcvd
Parametro restituito. Indica se il partner TP ha rilasciato MC_REQUEST_TO_SEND.AP_YES indica che il TP partner ha rilasciato MC_REQUEST_TO_SEND, che richiede che il TP locale cambi la conversazione in stato DI RICEZIONE.
AP_NO indica che il TP partner non ha rilasciato MC_REQUEST_TO_SEND.
Max_len
Parametro fornito. Specifica il numero massimo di byte di dati che il TP locale può ricevere. L'intervallo è compreso tra 0 e 65535.Il valore non deve superare la lunghezza del buffer per contenere i dati ricevuti. L'offset di dptr più il valore di max_len non deve superare le dimensioni del segmento di dati.
dlen
Parametro restituito. Specifica il numero di byte di dati ricevuti. I dati vengono archiviati nel buffer specificato da dptr. Una lunghezza pari a zero indica che non sono stati ricevuti dati.dptr
Parametro fornito. Fornisce l'indirizzo del buffer per contenere i dati ricevuti dall'LU locale.Per il sistema operativo Microsoft Windows, il buffer dei dati può risiedere in un'area dati statica o in un'area allocata a livello globale. Il buffer dei dati deve adattarsi interamente all'interno di questa area.
Per il sistema operativo/2, il buffer dei dati deve risiedere in un segmento condiviso senza nome, allocato dalla funzione DosAllocSeg con flag uguale a 1. Il buffer dei dati deve adattarsi interamente al segmento di dati.
Sema
Parametro fornito. Fornisce l'indirizzo del semaforo che APPC deve cancellare al termine dell'operazione di ricezione asincrona. Il parametro sema è un handle di evento ottenuto chiamando la funzione CreateEvent o OpenEvent Win32.
Codici restituiti
AP_OK
Codice restituito primario; il verbo eseguito correttamente.
Quando rtn_status è AP_YES, è possibile restituire il codice restituito precedente o uno dei codici restituiti seguenti.
AP_DATA_COMPLETE_SEND
Codice restituito primario; si tratta di una combinazione di AP_DATA_COMPLETE e AP_SEND.
AP_DATA_COMPLETE_CONFIRM_SEND
Codice restituito primario; si tratta di una combinazione di AP_DATA_COMPLETE e AP_CONFIRM_SEND.
AP_DATA_COMPLETE_CONFIRM
Codice restituito primario; si tratta di una combinazione di AP_DATA_COMPLETE e AP_CONFIRM_WHAT_RECEIVED.
AP_DATA_COMPLETE_CONFIRM_DEALL
Codice restituito primario; si tratta di una combinazione di AP_DATA_COMPLETE e AP_CONFIRM_DEALLOCATE.
AP_DEALLOC_NORMAL
Codice restituito primario; il tp del partner ha emesso MC_DEALLOCATE con dealloc_type impostato su AP_FLUSH o AP_SYNC_LEVEL con il livello di sincronizzazione della conversazione specificata come AP_NONE.
Se rtn_status è AP_YES , esaminare anche what_rcvd .
AP_PARAMETER_CHECK
Codice restituito primario; il verbo non è stato eseguito a causa di un errore di parametro.
AP_BAD_CONV_ID
Codice restituito secondario; il valore di conv_id non corrisponde a un identificatore di conversazione assegnato da APPC.
AP_BAD_TP_ID
Codice restituito secondario; il valore di tp_id non corrisponde a un identificatore TP assegnato da APPC.
AP_BAD_RETURN_STATUS_WITH_DATA
Codice restituito secondario; il valore rtn_status specificato non è stato riconosciuto da APPC.
AP_INVALID_DATA_SEGMENT
Codice restituito secondario; la lunghezza specificata per il buffer di dati è maggiore del segmento allocato per contenere il buffer.
AP_INVALID_SEMAPHORE_HANDLE
Codice restituito secondario; l'indirizzo del semaforo RAM o del semaforo di sistema non è valido.
Nota
APPC non può intercettare tutti gli handle di semaforo non validi. Se il tp passa un handle semaforo ram non valido, viene restituita una violazione di protezione.
AP_STATE_CHECK
Codice restituito primario; il verbo non è stato eseguito perché è stato emesso in uno stato non valido.
AP_RCV_AND_POST_BAD_STATE
Codice restituito secondario; la conversazione non era nello stato RECEIVE o SEND quando il tp ha emesso questo verbo.
AP_RCV_AND_POST_NOT_LL_BDY
Codice restituito secondario; la conversazione era in stato SEND; il tp ha iniziato ma non ha completato l'invio di un record logico.
AP_CANCELED
Codice restituito primario; il tp locale ha emesso uno dei verbi seguenti, che ha annullato MC_RECEIVE_AND_POST:
MC_DEALLOCATE con dealloc_type impostato su AP_ABEND
L'emissione di uno di questi verbi fa sì che il semaforo venga cancellato.
AP_ALLOCATION_ERROR
Codice restituito primario; APPC non è riuscito ad allocare una conversazione. Lo stato della conversazione è impostato su RESET.
Questo codice può essere restituito tramite un verbo emesso dopo MC_ALLOCATE.
AP_ALLOCATION_FAILURE_NO_RETRY
Codice restituito secondario; La conversazione non può essere allocata a causa di una condizione permanente, ad esempio un errore di configurazione o un errore del protocollo di sessione. Per determinare l'errore, l'amministratore di sistema deve esaminare il file di log degli errori. Non ripetere l'allocazione fino a quando l'errore non è stato corretto.
AP_ALLOCATION_FAILURE_RETRY
Codice restituito secondario; Impossibile allocare la conversazione a causa di una condizione temporanea, ad esempio un errore di collegamento. Il motivo dell'errore viene registrato nel log degli errori di sistema. Ripetere l'allocazione.
AP_CONVERSATION_TYPE_MISMATCH
Codice restituito secondario; l'lu partner o tp non supporta il tipo di conversazione (di base o mappato) specificato nella richiesta di allocazione.
AP_PIP_NOT_ALLOWED
Codice restituito secondario; la richiesta di allocazione specificata dai dati PIP, ma il tp del partner non richiede questi dati o l'lu del partner non la supporta.
AP_PIP_NOT_SPECIFIED_CORRECTLY
Codice restituito secondario; il tp del partner richiede dati PIP, ma la richiesta di allocazione non ha specificato dati PIP o un numero errato di parametri.
AP_SECURITY_NOT_VALID
Codice restituito secondario; l'identificatore utente o la password specificati nella richiesta di allocazione non sono stati accettati dal lu partner.
AP_SYNC_LEVEL_NOT_SUPPORTED
Codice restituito secondario; il tp del partner non supporta il sync_level (AP_NONE o AP_CONFIRM_SYNC_LEVEL) specificato nella richiesta di allocazione oppure il sync_level non è stato riconosciuto.
AP_TP_NAME_NOT_RECOGNIZED
Codice restituito secondario; l'lu partner non riconosce il nome TP specificato nella richiesta di allocazione.
AP_TRANS_PGM_NOT_AVAIL_NO_RETRY
Codice restituito secondario; l'lu remoto ha rifiutato la richiesta di allocazione perché non è stato in grado di avviare il tp del partner richiesto. La condizione è permanente. Il motivo dell'errore può essere connesso al nodo remoto. Non ripetere l'allocazione fino a quando l'errore non è stato corretto.
AP_TRANS_PGM_NOT_AVAIL_RETRY
Codice restituito secondario; l'lu remoto ha rifiutato la richiesta di allocazione perché non è stato in grado di avviare il tp del partner richiesto. La condizione può essere temporanea, ad esempio un timeout. Il motivo dell'errore può essere connesso al nodo remoto. Ripetere l'allocazione.
AP_COMM_SUBSYSTEM_ABENDED
Codice restituito primario; indica una delle condizioni seguenti:
Il nodo usato da questa conversazione ha rilevato un ABEND.
La connessione tra il tp e il nodo pu 2.1 è stata interrotta (errore LAN).
SnaBase nel computer tp ha rilevato un ABEND.
L'amministratore di sistema deve esaminare il log degli errori per determinare il motivo di ABEND.
AP_CONV_FAILURE_NO_RETRY
Codice restituito primario; la conversazione è stata terminata a causa di una condizione permanente, ad esempio un errore del protocollo di sessione. L'amministratore di sistema deve esaminare il log degli errori di sistema per determinare la causa dell'errore. Non ritentare la conversazione fino a quando l'errore non è stato corretto.AP_CONV_FAILURE_RETRY
Codice restituito primario; la conversazione è stata terminata a causa di un errore temporaneo. Riavviare il tp per verificare se il problema si verifica di nuovo. In caso affermativo, l'amministratore di sistema deve esaminare il log degli errori per determinare la causa dell'errore.AP_CONVERSATION_TYPE_MIXED
Codice restituito primario; il tp ha emesso verbi di conversazione di base e mappati. È possibile emettere un solo tipo in una singola conversazione.AP_INVALID_VERB_SEGMENT
Codice restituito primario; VCB si estende oltre la fine del segmento di dati.AP_PROG_ERROR_NO_TRUNC
Codice restituito primario; il partner TP ha emesso MC_SEND_ERROR mentre la conversazione era in stato SEND. I dati non sono stati troncati.AP_PROG_ERROR_PURGING
Codice restituito primario; durante lo stato RECEIVE, PENDING, PENDING_POST, CONFIRM, CONFIRM_SEND o CONFIRM_DEALLOCATE, il partner TP ha emesso MC_SEND_ERROR. I dati inviati ma non ancora ricevuti vengono eliminati.AP_STACK_TOO_SMALL
Codice restituito primario; le dimensioni dello stack dell'applicazione sono troppo piccole per eseguire il verbo. Aumentare le dimensioni dello stack dell'applicazione.AP_CONV_BUSY
Codice restituito primario; può essere presente un solo verbo di conversazione in sospeso alla volta in qualsiasi conversazione. Ciò può verificarsi se il tp locale ha più thread e più thread eseguono chiamate APPC usando lo stesso conv_id.AP_UNEXPECTED_DOS_ERROR
Codice restituito primario; il sistema operativo ha restituito un errore ad APPC durante l'elaborazione di una chiamata APPC dal tp locale. Il codice restituito dal sistema operativo viene restituito tramite il secondary_rc. Viene visualizzato nell'ordine di scambio dei byte Intel. Se il problema persiste, consultare l'amministratore di sistema.AP_DEALLOC_ABEND
Codice restituito primario; la conversazione è stata deallocata per uno dei motivi seguenti:Il MC_DEALLOCATE rilasciato dal partner con dealloc_type impostato su AP_ABEND.
Il partner TP ha rilevato un ABEND, causando l'invio di una richiesta di MC_DEALLOCATE da parte del partner LU.
Commenti
Il tp locale riceve i dati tramite il processo seguente:
Il tp locale rilascia un verbo di ricezione fino al termine della ricezione di un'unità completa di dati. I dati ricevuti sono un record di dati.
Il tp locale potrebbe dover emettere il verbo di ricezione più volte per ricevere un'unità completa di dati. Dopo aver ricevuto un'unità completa di dati, il tp locale può modificarlo. I verbi di ricezione sono MC_RECEIVE_AND_POST, MC_RECEIVE_AND_WAIT e MC_RECEIVE_IMMEDIATE.
Il tp locale rilascia nuovamente il verbo di ricezione. Questo ha uno degli effetti seguenti:
Se il tp del partner ha inviato più dati, il tp locale inizia a ricevere una nuova unità di dati.
Se il tp del partner ha terminato l'invio di dati o è in attesa di conferma, le informazioni sullo stato (disponibili tramite what_rcvd) indicano l'azione successiva eseguita normalmente dal tp locale.
La procedura seguente illustra le attività eseguite dal tp locale in tramite MC_RECEIVE_AND_POST.
Per usare MC_RECEIVE_AND_POST
Per il sistema operativo Windows, il tp recupera il numero di messaggio WinAsyncAPPC chiamando l'API RegisterWindowMessage o allocando un semaforo. Il campo sema deve essere impostato su NULL se l'applicazione prevede di ricevere una notifica tramite il meccanismo di messaggio di Windows.
APPC invia il messaggio di Windows o cancella il semaforo quando il tp locale termina la ricezione dei dati.
Per il sistema operativo/2, il tp usa la funzione DosSemSet per impostare il semaforo a cui punta sema.
Il semaforo rimarrà impostato mentre il tp locale riceve i dati in modo asincrono. APPC cancella il semaforo al termine della ricezione dei dati da parte del tp locale.
I problemi tp MC_RECEIVE_AND_POST.
Il tp controlla il valore di primary_rc.
Se primary_rc è AP_OK , il buffer di ricezione (a cui punta dptr) riceve i dati dal tp del partner in modo asincrono. Durante la ricezione dei dati in modo asincrono, il tp locale può:
Eseguire attività non correlate a questa conversazione.
Problema MC_REQUEST_TO_SEND.
Raccogliere informazioni su questa conversazione eseguendo GET_TYPE, MC_GET_ATTRIBUTES o MC_TEST_RTS.
Annullare MC_RECEIVE_AND_POST in modo prematuro eseguendo MC_DEALLOCATE con dealloc_type impostato su AP_ABEND; MC_SEND_ERROR; o TP_ENDED.
Se, tuttavia, primary_rc non è AP_OK, MC_RECEIVE_AND_POST ha avuto esito negativo. In questo caso, il tp locale non esegue le due attività successive.
Per il sistema operativo Windows, quando il tp termina la ricezione dei dati in modo asincrono, APPC genera il messaggio di Windows WinAsyncAPPC o cancella il semaforo.
Per il sistema operativo/2, il tp usa la funzione DosSemWait per attendere che APPC cancella il semaforo a cui punta semama. Al termine della ricezione dei dati in modo asincrono, APPC cancella il semaforo. Per evitare che il tp locale sia in attesa, testare il semaforo (richiamando DosSemWait con Timeout impostato su zero) fino a quando APPC non cancella il semaforo.
Il tp verifica il nuovo valore di primary_rc.
Se primary_rc è AP_OK, il tp locale può esaminare gli altri parametri restituiti e modificare i dati ricevuti in modo asincrono.
Se primary_rc non è AP_OK, sono significativi solo secondary_rc e rts_rcvd (ricevuti da richiesta a invio).
Effetti dello stato della conversazione
La conversazione deve essere in stato RECEIVE o SEND quando il tp rilascia questo verbo.
L'emissione di MC_RECEIVE_AND_POST mentre la conversazione è in stato SEND ha gli effetti seguenti:
L'lu locale invia le informazioni nel buffer di invio e un indicatore SEND al tp del partner.
La conversazione cambia in PENDING_POST stato; il tp locale è pronto per ricevere informazioni dal tp del partner in modo asincrono.
La conversazione cambia due volte:
Al ritorno iniziale del verbo, se primary_rc contiene AP_OK, la conversazione cambia in PENDING_POST stato.
Dopo il completamento del verbo, lo stato cambia a seconda del valore di quanto segue:
Parametro primary_rc
Parametro what_rcvd se primary_rc è AP_OK
Nella tabella seguente viene illustrato il nuovo stato associato a ogni valore di what_rcvd quando primary_rc è AP_OK.
what_rcvd | Nuovo stato |
---|---|
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 | CONFERMA |
AP_DATA_COMPLETE_CONFIRM | CONFERMA |
AP_DATA_CONFIRM | CONFERMA |
AP_DATA | RECEIVE |
AP_DATA_COMPLETE | RECEIVE |
AP_DATA_INCOMPLETE | RECEIVE |
AP_SEND | SEND |
AP_DATA_COMPLETE_SEND | SEND_PENDING |
Nella tabella seguente viene illustrato il nuovo stato associato a ogni valore di primary_rc diverso da AP_OK.
Primary_rc | Nuovo stato |
---|---|
AP_CANCELED | Nessuna modifica |
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 |