MC_RECEIVE_AND_POST

El verbo MC_RECEIVE_AND_POST recibe de forma asincrónica los datos de la aplicación y la información de estado. Esto permite que el programa de transacciones locales (TP) continúe con el procesamiento mientras los datos siguen llegando a la unidad lógica local (LU).

Aunque hay una MC_RECEIVE_AND_POST asincrónica pendiente, se pueden emitir los verbos siguientes en la misma conversación:

  • GET_TYPE

  • MC_GET_ATTRIBUTES

  • MC_REQUEST_TO_SEND

  • MC_SEND_ERROR

  • MC_TEST_RTS

  • TP_ENDED

    Esto permite que una aplicación use una MC_RECEIVE_AND_POST asincrónica para recibir datos. Aunque el MC_RECEIVE_AND_POST pendiente, todavía puede usar MC_SEND_ERROR yREQUEST_TO_SEND. Se recomienda usar esta característica para la compatibilidad asincrónica completa. Para obtener información sobre cómo un TP recibe datos y cómo usar este verbo, vea Comentarios en este tema.

    La siguiente estructura describe el bloque de control de verbo (VCB) utilizado por el verbo MC_RECEIVE_AND_POST verbo.

Sintaxis

  
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;  
};   

Miembros

opcode
Parámetro proporcionado. Especifica el código de operación de verbo, AP_M_RECEIVE_AND_POST.

opext
Parámetro proporcionado. Especifica la extensión de operación de verbo, AP_MAPPED_CONVERSATION.

reserv2
Campo reservado.

primary_rc
Parámetro devuelto. Especifica el código de retorno principal que establece APPC al finalizar el verbo. Los códigos de retorno válidos varían en función del verbo APPC que se emita. Consulte la sección de códigos de retorno para obtener los códigos de error válidos para este verbo.

secondary_rc
Parámetro devuelto. Especifica el código de retorno secundario que establece APPC al finalizar el verbo. Los códigos de retorno válidos varían en función del verbo APPC que se emita. Consulte la sección de códigos de retorno para obtener los códigos de error válidos para este verbo.

tp_id
Parámetro proporcionado. Identifica el TP local. El valor de este parámetro se devuelve TP_STARTED en la invocación de TP o by RECEIVE_ALLOCATE en el TP invocado.

conv_id
Parámetro proporcionado. Proporciona el identificador de conversación. El valor de este parámetro se devuelve MC_ALLOCATE en el TP invocando o mediante RECEIVE_ALLOCATE en el TP invocado.

what_rcvd
Parámetro devuelto. Indica si se han recibido datos o el estado de la conversación.

  • AP_CONFIRM_DEALLOCATE indica que el TP del asociado emitió MC_DEALLOCATE condealloc_type establecido en AP_SYNC_LEVEL. El nivel de sincronización de la conversación, establecido por MC_ALLOCATE, es AP_CONFIRM_SYNC_LEVEL. Al recibir este valor, el TP local normalmente emite MC_CONFIRMED.

  • AP_CONFIRM_SEND indica que el TP del asociado emitió MC_PREPARE_TO_RECEIVE con ptr_type establecido en AP_SYNC_LEVEL. El nivel de sincronización de la conversación, establecido por MC_ALLOCATE, es AP_CONFIRM_SYNC_LEVEL. Al recibir este valor, el TP local normalmente emite MC_CONFIRMED y comienza a enviar datos.

  • AP_CONFIRM_WHAT_RECEIVED indica que el TP del asociado emitió MC_CONFIRM. Al recibir este valor, el TP local normalmente emite MC_CONFIRMED.

  • AP_DATA_COMPLETE indica, por MC_RECEIVE_AND_POST, que el TP local ha recibido un registro de datos completo o la última parte de un registro de datos. Al recibir este valor, el TP local normalmente se MC_RECEIVE_AND_POST o emite otro verbo de recepción. Si el TP del asociado ha enviado más datos, el TP local comienza a recibir una nueva unidad de datos. De lo contrario, el TP local examina la información de estado.

    Si primary_rc contiene AP_OK y what_rcvd contiene AP_SEND, AP_CONFIRM_SEND, AP_CONFIRM_DEALLOCATE o AP_CONFIRM_WHAT_RECEIVED, vea la descripción del valor (en esta sección) para la siguiente acción que normalmente realiza el TP local.

    Si primary_rc contiene AP_DEALLOC_NORMAL, la conversación se ha desasignado en respuesta a los MC_DEALLOCATE emitidos por el TP del asociado.

  • AP_DATA_INCOMPLETE indica, por MC_RECEIVE_AND_POST, que el TP local ha recibido un registro de datos incompleto. El max_len especifica un valor menor que la longitud del registro de datos (o menor que el resto del registro de datos si no es el primer verbo de recepción que lee el registro). Al recibir este valor, el TP local normalmente MC_RECEIVE_AND_POST (o emite otro verbo de recepción) para recibir la siguiente parte del registro.

  • AP_NONE indica que el TP no recibió indicadores de estado de conversación o datos.

  • AP_SEND indica, para el TP del asociado, que la conversación ha entrado en estado RECEIVE. Para el TP local, la conversación está ahora en estado SEND. Al recibir este valor, el TP local normalmente usa MC_SEND_DATA para empezar a enviar datos.

    rtn_status
    Parámetro proporcionado. Indica si los indicadores de estado de los datos y de la conversación deben devolverse dentro de una llamada API.

  • AP_NO especifica que los indicadores se deben devolver individualmente en invocaciones independientes del verbo.

  • AP_YES especifica que los indicadores se deben devolver juntos, siempre que ambos estén disponibles. Ambos se pueden devolver cuando:

    El búfer de recepción es lo suficientemente grande como para contener todos los datos que preceden al indicador de estado.

    Los datos son el último registro de datos antes del indicador de estado.

    rts_rcvd
    Parámetro devuelto. Indica si el TP del asociado emitió MC_REQUEST_TO_SEND.

  • AP_YES indica que el TP del asociado emitió MC_REQUEST_TO_SEND, que solicita que el TP local cambie la conversación al estado RECEIVE.

  • AP_NO indica que el TP del asociado no ha emitido MC_REQUEST_TO_SEND.

    Max_len
    Parámetro proporcionado. Especifica el número máximo de bytes de datos que puede recibir el TP local. El intervalo está entre 0 y 65535.

    El valor no debe superar la longitud del búfer para contener los datos recibidos. El desplazamiento de dptr más el valor de max_len no debe superar el tamaño del segmento de datos.

    dlen
    Parámetro devuelto. Especifica el número de bytes de datos recibidos. Los datos se almacenan en el búfer especificado por dptr. Una longitud de cero indica que no se recibió ningún dato.

    dptr
    Parámetro proporcionado. Proporciona la dirección del búfer para contener los datos recibidos por la LU local.

    En el caso del Windows operativo de Microsoft, el búfer de datos puede residir en un área de datos estática o en un área asignada globalmente. El búfer de datos debe caber completamente dentro de esta área.

    Para el sistema operativo OS/2, el búfer de datos debe residir en un segmento compartido sin nombre, asignado por la función DosAllocSeg con marcas iguales a 1. El búfer de datos debe caber completamente en el segmento de datos.

    Sema
    Parámetro proporcionado. Proporciona la dirección del semáforo que APPC debe borrar cuando finalice la operación de recepción asincrónica. El parámetro sema es un identificador de evento obtenido mediante una llamada a la función CreateEvent o OpenEvent Win32.

Códigos de retorno

AP_OK
Código de retorno principal; el verbo se ha ejecutado correctamente.

Cuando rtn_status se AP_YES, se puede devolver el código de retorno anterior o uno de los siguientes códigos de retorno.

AP_DATA_COMPLETE_SEND

Código de retorno principal; se trata de una combinación de AP_DATA_COMPLETE y AP_SEND.

AP_DATA_COMPLETE_CONFIRM_SEND

Código de retorno principal; se trata de una combinación de AP_DATA_COMPLETE y AP_CONFIRM_SEND.

AP_DATA_COMPLETE_CONFIRM

Código de retorno principal; se trata de una combinación de AP_DATA_COMPLETE y AP_CONFIRM_WHAT_RECEIVED.

AP_DATA_COMPLETE_CONFIRM_DEALL

Código de retorno principal; se trata de una combinación de AP_DATA_COMPLETE y AP_CONFIRM_DEALLOCATE.

AP_DEALLOC_NORMAL
Código de retorno principal; el tp de asociado emitido MC_DEALLOCATE con dealloc_type establecido en AP_FLUSH o AP_SYNC_LEVEL con el nivel de sincronización de la conversación especificada como AP_NONE.

Si rtn_status está AP_YES, examine what_rcvd también.

AP_PARAMETER_CHECK
Código de retorno principal; el verbo no se ha ejecutado debido a un error en un parámetro.

AP_BAD_CONV_ID

Código de retorno secundario; el valor de conv_id no coincide con un identificador de conversación asignado por APPC.

AP_BAD_TP_ID

Código de retorno secundario; el valor de tp_id no coincide con un identificador TP asignado por APPC.

AP_BAD_RETURN_STATUS_WITH_DATA

Código de retorno secundario; APPC no rtn_status el valor especificado.

AP_INVALID_DATA_SEGMENT

Código de retorno secundario; la longitud especificada para el búfer de datos era mayor que el segmento asignado para contener el búfer.

AP_INVALID_SEMAPHORE_HANDLE

Código de retorno secundario; la dirección del semáforo de RAM o del identificador del semáforo del sistema no era válida.

Nota

APPC no puede capturar todos los identificadores de semáforo no válidos. Si el procesamiento de transacciones pasa un identificador del semáforo RAM no válido, se produce una infracción de la protección.

AP_STATE_CHECK
Código de retorno principal; el verbo no se ejecutó porque se emitió en un estado no válido.

AP_RCV_AND_POST_BAD_STATE

Código de retorno secundario; la conversación no estaba en estado RECEIVE o SEND cuando el TP emitió este verbo.

AP_RCV_AND_POST_NOT_LL_BDY

Código de retorno secundario; la conversación estaba en estado SEND; el TP comenzó pero no finaló el envío de un registro lógico.

AP_CANCELED
Código de retorno principal; el TP local emitió uno de los verbos siguientes, que canceló MC_RECEIVE_AND_POST:

MC_DEALLOCATE con dealloc_type establecido en AP_ABEND

MC_SEND_ERROR

TP_ENDED

La emisión de uno de estos verbos hace que se despeja el semáforo.

AP_ALLOCATION_ERROR
Código de retorno principal; APPC no ha podido asignar una conversación. El estado de la conversación se establece en RESET.

Este código se puede devolver a través de un verbo emitido después de MC_ALLOCATE.

AP_ALLOCATION_FAILURE_NO_RETRY

Código de retorno secundario; no se puede asignar la conversación debido a una condición permanente, como un error de configuración o un error de protocolo de sesión. Para determinar el error, el administrador del sistema debe examinar el archivo de registro de errores. No vuelva a intentar la asignación hasta que se haya corregido el error.

AP_ALLOCATION_FAILURE_RETRY

Código de retorno secundario; no se pudo asignar la conversación debido a una condición temporal, como un error de vínculo. El motivo del error se registra en el registro de errores del sistema. Vuelva a intentar la asignación.

AP_CONVERSATION_TYPE_MISMATCH

Código de retorno secundario; la LU o TP del asociado no admite el tipo de conversación (básico o asignado) especificado en la solicitud de asignación.

AP_PIP_NOT_ALLOWED

Código de retorno secundario; la solicitud de asignación especifica datos PIP, pero el TP del asociado no requiere estos datos o el LU del asociado no los admite.

AP_PIP_NOT_SPECIFIED_CORRECTLY

Código de retorno secundario; el TP del asociado requiere datos PIP, pero la solicitud de asignación no especificó ningún dato PIP o un número incorrecto de parámetros.

AP_SECURITY_NOT_VALID

Código de retorno secundario; El LU del asociado no aceptó el identificador de usuario o la contraseña especificados en la solicitud de asignación.

AP_SYNC_LEVEL_NOT_SUPPORTED

Código de retorno secundario; el TP del asociado no admite el sync_level (AP_NONE o AP_CONFIRM_SYNC_LEVEL) especificado en la solicitud de asignación o no se ha reconocido el sync_level.

AP_TP_NAME_NOT_RECOGNIZED

Código de retorno secundario; la LU del asociado no reconoce el nombre tp especificado en la solicitud de asignación.

AP_TRANS_PGM_NOT_AVAIL_NO_RETRY

Código de retorno secundario; la LU remota rechazó la solicitud de asignación porque no pudo iniciar el TP del asociado solicitado. La condición es permanente. El motivo del error se puede registrar en el nodo remoto. No vuelva a intentar la asignación hasta que se haya corregido el error.

AP_TRANS_PGM_NOT_AVAIL_RETRY

Código de retorno secundario; la LU remota rechazó la solicitud de asignación porque no pudo iniciar el TP del asociado solicitado. La condición puede ser temporal, como un tiempo de espera. El motivo del error se puede registrar en el nodo remoto. Vuelva a intentar la asignación.

AP_COMM_SUBSYSTEM_ABENDED
Código de retorno principal; indica una de las condiciones siguientes:

  • El nodo utilizado por esta conversación encontró una anulación.

  • La conexión entre el TP y el nodo PU 2.1 se interrumpió (un error de LAN).

  • El proceso SnaBase que se ejecuta en el equipo del TP encontró una anulación.

    El administrador del sistema debe examinar el registro de errores a fin de determinar el motivo de la anulación.

    AP_CONV_FAILURE_NO_RETRY
    Código de retorno principal; la conversación se finalizó debido a una condición permanente, como un error de protocolo de sesión. El administrador del sistema debe examinar el registro de errores del sistema para determinar la causa del error. No vuelva a intentar la conversación hasta que se corrija el error.

    AP_CONV_FAILURE_RETRY
    Código de retorno principal; la conversación se finalizó debido a un error temporal. Reinicie el TP para ver si el problema se produce de nuevo. Si es así, el administrador del sistema debe examinar el registro de errores para determinar la causa del error.

    AP_CONVERSATION_TYPE_MIXED
    Código de retorno principal; el TP ha emitido verbos de conversación tanto básicos como asignados. Solo se puede emitir un tipo en una sola conversación.

    AP_INVALID_VERB_SEGMENT
    Código de retorno principal; el bloque de control de verbo (VCB) se ha extendido más allá del final del segmento de datos.

    AP_PROG_ERROR_NO_TRUNC
    Código de retorno principal; el TP del asociado emitió MC_SEND_ERROR mientras la conversación estaba en estado SEND. Los datos no se han truncado.

    AP_PROG_ERROR_PURGING
    Código de retorno principal; mientras se encuentra en los estados RECEIVE, PENDING, PENDING_POST, CONFIRM, CONFIRM_SEND o CONFIRM_DEALLOCATE, el TP del asociado emitió MC_SEND_ERROR. Los datos enviados pero aún no recibidos se purgan.

    AP_STACK_TOO_SMALL
    Código de retorno principal; el tamaño de la pila de la aplicación es demasiado pequeño para ejecutar el verbo. Aumente el tamaño de pila de la aplicación.

    AP_CONV_BUSY
    Código de retorno principal; solo puede haber un verbo de conversación pendiente a la vez en cualquier conversación. Esto puede ocurrir si el TP local tiene varios subprocesos y más de un subproceso emite llamadas APPC con el mismo conv_id.

    AP_UNEXPECTED_DOS_ERROR
    Código de retorno principal; el sistema operativo devolvió un error a APPC al procesar una llamada de APPC desde el TP local. El código de retorno del sistema operativo se devuelve a través de secondary_rc. Aparece en el orden de intercambio de bytes de Intel. Si el problema persiste, consulte con el administrador del sistema.

    AP_DEALLOC_ABEND
    Código de retorno principal; la conversación se ha desasignado por uno de los siguientes motivos:

  • El tp de asociado emitido MC_DEALLOCATE con dealloc_type establecido en AP_ABEND.

  • El TP del asociado encontró un ABEND, lo que provocó que la LU del asociado enviara una MC_DEALLOCATE cliente.

Observaciones

El TP local recibe datos a través del siguiente proceso:

  1. El TP local emite un verbo de recepción hasta que termina de recibir una unidad completa de datos. Los datos recibidos son un registro de datos.

    Es posible que el TP local tenga que emitir el verbo de recepción varias veces para recibir una unidad completa de datos. Una vez recibida una unidad completa de datos, el TP local puede manipularlos. Los verbos de recepción se MC_RECEIVE_AND_POST, MC_RECEIVE_AND_WAIT y MC_RECEIVE_IMMEDIATE.

  2. El TP local vuelve a emite el verbo de recepción. Esto tiene uno de los efectos siguientes:

    • Si el TP del asociado ha enviado más datos, el TP local comienza a recibir una nueva unidad de datos.

    • Si el TP del asociado ha terminado de enviar datos o está esperando confirmación, la información de estado (disponible a través de what_rcvd) indica la siguiente acción que normalmente realiza el TP local.

    El procedimiento siguiente muestra las tareas realizadas por el TP local en mediante MC_RECEIVE_AND_POST.

Para usar MC_RECEIVE_AND_POST

  1. Para el Windows operativo, el TP recupera el número de mensaje WinAsyncAPPC llamando a la API RegisterWindowMessage o asignando un semáforo. El campo sema debe establecerse en NULL si la aplicación espera recibir una notificación a través del Windows mensaje.

    APPC envía el Windows o borra el semáforo cuando el TP local termina de recibir datos.

    Para el sistema operativo OS/2, el TP usa la función DosSemSet para establecer el semáforo al que apunta sema.

    El semáforo permanecerá establecido mientras el TP local reciba los datos de forma asincrónica. APPC borrará el semáforo cuando el TP local termine de recibir datos.

  2. El tp emite MC_RECEIVE_AND_POST.

  3. El TP comprueba el valor de primary_rc.

    Si primary_rc está AP_OK, el búfer de recepción (al que apunta dptr) recibe de forma asincrónica datos del TP del asociado. Al recibir datos de forma asincrónica, el TP local puede:

  4. Para el Windows operativo, cuando el TP termina de recibir datos de forma asincrónica, APPC emite el mensaje Windows WinAsyncAPPC o borra el semáforo.

    Para el sistema operativo OS/2, el TP usa la función DosSemWait para esperar a que APPC borre el semáforo al que apunta sema. Cuando el TP termina de recibir datos de forma asincrónica, APPC borra el semáforo. Para evitar que el TP local esté esperando, haga que pruebe el semáforo (invocando DosSemWait con tiempo de espera establecido en cero) hasta que APPC borre el semáforo.

  5. El TP comprueba el nuevo valor de primary_rc.

    Si primary_rc se AP_OK, el TP local puede examinar los demás parámetros devueltos y manipular los datos recibidos de forma asincrónica.

    Si primary_rc no se AP_OK, solo secondary_rc y rts_rcvd (solicitud de envío recibida) son significativos.

    Efectos de estado de conversación

    La conversación debe estar en estado RECEIVE o SEND cuando el TP emite este verbo.

    La emisión MC_RECEIVE_AND_POST mientras la conversación está en estado SEND tiene los efectos siguientes:

  • La LU local envía la información en su búfer de envío y un indicador SEND al TP del asociado.

  • La conversación cambia a PENDING_POST estado; el TP local está listo para recibir información del TP del asociado de forma asincrónica.

    La conversación cambia de estado dos veces:

  • Tras la devolución inicial del verbo, si primary_rc contiene AP_OK, la conversación cambia a PENDING_POST estado.

  • Después de la finalización del verbo, el estado cambia en función del valor de lo siguiente:

    El primary_rc parámetro

    Parámetro what_rcvd si primary_rc se AP_OK

    En la tabla siguiente se muestra el nuevo estado asociado a cada valor de what_rcvdcuando primary_rc se AP_OK.

what_rcvd Nuevo estado
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 CONFIRMAR
AP_DATA_COMPLETE_CONFIRM CONFIRMAR
AP_DATA_CONFIRM CONFIRMAR
AP_DATA RECEIVE
AP_DATA_COMPLETE RECEIVE
AP_DATA_INCOMPLETE RECEIVE
AP_SEND ENVIAR
AP_DATA_COMPLETE_SEND SEND_PENDING

En la tabla siguiente se muestra el nuevo estado asociado a cada valor de primary_rc distinto de AP_OK.

primary_rc Nuevo estado
AP_CANCELED Sin cambios
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