MC_RECEIVE_IMMEDIATE

MC_RECEIVE_IMMEDIATE谓词接收合作伙伴事务计划(TP)当前提供的任何数据。 如果没有数据可用,则本地 TP 不会等待。 为了避免阻止对话,请将 MC_RECEIVE_AND_WAITWinAsyncAPPC 结合使用。 以下结构描述了 MC_RECEIVE_IMMEDIATE 谓词使用的谓词控制块(VCB)。

语法

  
struct mc_receive_immediate {  
    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       reserv6[5];  
};   

成员

Opcode
提供的参数。 指定谓词作代码,AP_M_RECEIVE_IMMEDIATE。

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 已MC_DEALLOCATE dealloc_type设置为AP_SYNC_LEVEL,MC_ALLOCATE建立的对话同步级别AP_CONFIRM_SYNC_LEVEL。 收到此值后,本地 TP 通常会 发出MC_CONFIRMED

  • AP_CONFIRM_SEND表示合作伙伴 TP 已MC_PREPARE_TO_RECEIVE ptr_type设置为AP_SYNC_LEVEL,MC_ALLOCATE建立的对话同步级别AP_CONFIRM_SYNC_LEVEL。 收到此值后,本地 TP 通常会 发出MC_CONFIRMED,并开始发送数据。

  • AP_CONFIRM_WHAT_RECEIVED指示合作伙伴 TP 已发出 MC_CONFIRM。 收到此值后,本地 TP 通常会 发出MC_CONFIRMED

  • AP_DATA_COMPLETE指示,对于映射会话中的 MC_RECEIVE_IMMEDIATE ,本地 TP 已收到完整的数据记录或数据记录的最后一部分。 收到此值后,本地 TP 通常会重新发出 MC_RECEIVE_IMMEDIATE 或发出另一个接收谓词。 如果合作伙伴 TP 发送了更多数据,则本地 TP 开始接收新的数据单元。

    否则,如果 primary_rc包含AP_OK 并且 what_rcvd 包含以下任何值,则本地 TP 会检查状态信息:

    AP_SEND

    AP_CONFIRM_SEND

    AP_CONFIRM_DEALLOCATE

    AP_CONFIRM_WHAT_RECEIVED

    有关本地 TP 通常采取的下一作,请参阅本主题中返回代码中的值的说明。

    如果 primary_rc 包含AP_DEALLOC_NORMAL,则已解除分配对话,以响应合作伙伴 TP 发出的 MC_DEALLOCATE

  • AP_DATA_INCOMPLETE指示本地 TP 已收到不完整数据记录的映射会话中的 MC_RECEIVE_IMMEDIATEmax_len参数指定的值小于数据记录的长度(如果这不是读取记录的第一个接收谓词,则小于数据记录的其余部分)。 收到此值后,本地 TP 通常会重新发出 MC_RECEIVE_IMMEDIATE (或发出另一个接收谓词),以接收记录的下一部分。

  • AP_NONE指示 TP 未接收数据或聊天状态指示器。

  • AP_SEND表示,对于合作伙伴 TP,会话已进入 RECEIVE 状态。 对于本地 TP,会话现在处于 SEND 状态。 收到此值后,本地 TP 通常使用 MC_SEND_DATA 开始发送数据。

    rtn_status
    提供的参数。 指示是否应在一个 API 调用中返回数据和聊天状态指示器。

  • AP_NO指定应在动词的单独调用中单独返回指示器。

  • AP_YES指定应同时返回指示器,前提是两者都可用。 两者都可以在以下情况下返回:

    接收缓冲区足够大,足以容纳状态指示器之前的所有数据。

    数据是状态指示器之前的最后一条数据记录。

    rts_rcvd
    返回的参数。 包含请求到发送指示器。 可能的值为:

  • AP_YES指示合作伙伴 TP 已发出 MC_REQUEST_TO_SEND,请求本地 TP 将会话更改为 RECEIVE 状态。

  • AP_NO表示合作伙伴 TP 尚未发出 MC_REQUEST_TO_SEND

    max_len
    提供的参数。 指示本地 TP 可以接收的最大数据字节数。 范围为 0 到 65535。

    对于Microsoft Windows作系统和 Windows 图形环境,此值不得超过缓冲区长度才能包含接收的数据。

    对于 OS/2作系统, dptr 的偏移量加上 max_len 的值不得超过数据段的大小。

    通过将 max_len 设置为零的 MC_RECEIVE_IMMEDIATE 发出,本地 TP 可以确定合作伙伴 TP 是否具有要发送、寻求确认或更改聊天状态的数据。

    dlen
    返回的参数。 提供接收的数据字节数。 数据存储在 dptr 指定的缓冲区中。 长度为零表示未收到任何数据。

    dptr
    提供的参数。 要包含本地 TP 接收的数据的缓冲区的地址。

    对于 Windows作系统和 Windows 图形环境,数据缓冲区可以驻留在静态数据区域或全局分配的区域。 数据缓冲区必须完全适合此区域。

    对于 OS/2作系统,数据缓冲区必须驻留在未命名的共享段上,该段由函数 DosAllocSeg 分配,标志等于 1。 数据缓冲区必须完全适合数据段。

返回代码

AP_OK
主要返回代码;已成功执行谓词。

AP_YES rtn_status时,可以返回上述返回代码或以下返回代码之一。

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_UNSUCCESSFUL
主要返回代码;合作伙伴 TP 不会立即提供任何数据。

AP_DEALLOC_NORMAL
主要返回代码;合作伙伴 TP 已解除分配会话,而无需请求确认。 合作伙伴 TP 颁发MC_DEALLOCATE,dealloc_type设置为以下项之一:

  • AP_FLUSH

  • 具有指定为AP_NONE的对话的同步级别的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

    辅助返回代码;APPC 无法识别指定的 rtn_status 值。

    AP_INVALID_DATA_SEGMENT

    辅助返回代码;为数据缓冲区指定的长度比分配给包含缓冲区的段长。

    AP_STATE_CHECK
    主要返回代码;该谓词未执行,因为它以无效状态发出。

    AP_RCV_IMMD_BAD_STATE

    辅助返回代码;会话未处于 RECEIVE 状态。

    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 已发出基本和映射的对话谓词。 单个对话中只能发出一种类型。

    AP_INVALID_VERB_SEGMENT
    主要返回代码;VCB 超出了数据段的末尾。

    AP_PROG_ERROR_NO_TRUNC
    主要返回代码;当会话处于 SEND 状态时,合作伙伴 TP 已发出 MC_SEND_ERROR 。 数据未截断。

    AP_PROG_ERROR_PURGING
    主要返回代码;在 RECEIVE、PENDING、PENDING_POST、CONFIRM、CONFIRM_SEND 或 CONFIRM_DEALLOCATE 状态中,合作伙伴 TP 发出 MC_SEND_ERROR。 已清除发送但尚未收到的数据。

    AP_STACK_TOO_SMALL
    主要返回代码;应用程序的堆栈大小太小,无法执行谓词。 增加应用程序的堆栈大小。

    AP_CONV_BUSY
    主要返回代码;在任何对话中,一次只能有一个未完成的对话谓词。 如果本地 TP 有多个线程,并且多个线程使用相同的 conv_id发出 APPC 调用,则可能会出现这种情况。

    AP_UNEXPECTED_DOS_ERROR
    主要返回代码;作系统在处理来自本地 TP 的 APPC 调用时,已将错误返回到 APPC。 作系统返回代码通过 secondary_rc返回。 它以 Intel 字节交换的顺序显示。 如果问题仍然存在,请咨询系统管理员。

    AP_DEALLOC_ABEND
    主要返回代码;由于以下原因之一,已解除分配会话:

  • 合作伙伴 TP 发布了MC_DEALLOCATE,dealloc_type设置为AP_ABEND。

  • 合作伙伴 TP 遇到 ABEND,导致合作伙伴 LU 发送 MC_DEALLOCATE 请求。

注解

本地 TP 通过以下过程接收数据:

  1. 本地 TP 发出接收谓词,直到它完成接收完整的数据单元。 收到的数据是一条数据记录。

    为了接收完整的数据单元,本地 TP 可能需要多次发出接收谓词。 收到完整的数据单元后,本地 TP 可以对其进行作。

    接收谓词是 MC_RECEIVE_AND_POSTMC_RECEIVE_AND_WAITMC_RECEIVE_IMMEDIATE

  2. 本地 TP 再次发出接收谓词。 这具有以下效果之一:

    • 如果合作伙伴 TP 发送了更多数据,则本地 TP 开始接收新的数据单元。

    • 如果合作伙伴 TP 已完成发送数据或正在等待确认,则状态信息(通过 what_rcvd提供)表示本地 TP 通常执行的下一个作。

    当 TP 发出此谓词时,会话必须处于 RECEIVE 状态。

    新状态由 primary_rc确定。 如果 primary_rc AP_OK ,则新状态由 what_rcvd确定。

    下表详细介绍了 primary_rc AP_OK时的状态更改。

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 确认
AP_DATA_COMPLETE_CONFIRM 确认
AP_DATA_CONFIRM 确认
AP_DATA 无更改
AP_DATA_COMPLETE 无更改
AP_DATA_INCOMPLETE 无更改
AP_SEND 发送
AP_DATA_COMPLETE_SEND SEND_PENDING

下表详细说明了 primary_rc 未AP_OK时的状态更改。

primary_rc 新状态
AP_ALLOCATION_ERROR 重置
AP_CONV_FAILURE_RETRY 重置
AP_CONV_FAILURE_NO_RETRY 重置
AP_DEALLOC_ABEND 重置
AP_DEALLOC_ABEND_PROG 重置
AP_DEALLOC_ABEND_SVC 重置
AP_DEALLOC_ABEND_TIMER 重置
AP_DEALLOC_NORMAL 重置
AP_PROG_ERROR_PURGING 无更改
AP_PROG_ERROR_NO_TRUNC 无更改
AP_SVC_ERROR_PURGING 无更改
AP_SVC_ERROR_NO_TRUNC 无更改
AP_PROG_ERROR_TRUNC 无更改
AP_SVC_ERROR_TRUNC 无更改
AP_UNSUCCESSFUL 无更改