Send_Data(CPI-C)

Send_Data调用(函数名称 cmsend)将数据放入本地逻辑单元(LU)的发送缓冲区中,以便传输到合作伙伴计划。

语法

  
CM_ENTRY Send_Data(   
  unsigned char FAR *conversation_ID,    
  unsigned char FAR *buffer,             
    CM_INT32 FAR *send_length,             
    CM_INT32 FAR *request_to_send_received,    
    CM_INT32 FAR *return_code              
);  

参数

conversation_ID
提供的参数。 指定会话的标识符。 此参数的值由 Initialize_ConversationAccept_Conversation返回。

缓冲区
提供的参数。 指定要放入本地 LU 发送缓冲区中的数据的缓冲区的地址。

send_length
提供的参数。 指定要放入本地 LU 发送缓冲区的数据字节数。 范围为 0 到 32767。

对于映射的对话,如果 send_length 设置为零,则会向合作伙伴计划发送空数据记录。

对于基本对话,如果 send_length 设置为零,则不会发送任何数据。 缓冲区参数不相关。 但是,将处理其他参数。

request_to_send_received
返回的参数。 它是请求到发送接收的指示器。 可能的值为:

CM_REQ_TO_SEND_RECEIVED
合作伙伴计划发出 了Request_To_Send 呼叫,该呼叫请求本地计划将会话更改为 RECEIVE 状态。

CM_REQ_TO_SEND_NOT_RECEIVED
合作伙伴计划未发出 Request_To_Send 呼叫。 如果 return_code设置为CM_PROGRAM_PARAMETER_CHECK 或CM_PROGRAM_STATE_CHECK,则此值不相关。

return_code
从此调用返回的代码。 本主题后面列出了有效的返回代码。

返回代码

CM_OK
主要返回代码;调用已成功执行。

CM_OPERATION_NOT_ACCEPTED
主要返回代码;此对话的上一个作不完整。

CM_OPERATION_INCOMPLETE
主要返回代码;作尚未完成(仅处理模式为非阻止),仍在进行中。 程序可以发出 Wait_For_Conversation 等待作完成,或 Cancel_Conversation 取消作和对话。 如果已调用 Specify_Windows_Handle ,应用程序应等待Microsoft® Windows® 消息通知,而不是调用 Wait_For_Conversation

CM_PROGRAM_PARAMETER_CHECK
主要返回代码;发生以下事件之一:

  • 由conversation_ID指定的值无效。

  • 由send_length指定的值超出范围(大于 32767)。

  • 这是一个基本对话,前两个字节的 缓冲区 包含无效的逻辑记录长度(0x0000、0x0001、0x8000或0x8001)。

    CM_PROGRAM_STATE_CHECK
    主要返回代码;发生以下事件之一:

  • 会话状态不是 SEND 或SEND_PENDING。

  • 基本会话处于 SEND 状态, send_type 设置为CM_SEND_AND_CONFIRM、CM_SEND_AND_DEALLOCATE或CM_SEND_AND_PREP_TO_RECEIVE。 但是,数据不会在逻辑记录边界上结束。 仅当 deallocate_type设置为CM_DEALLOCATE_ABENDsend_type 设置为CM_SEND_AND_DEALLOCATE时,才允许此条件。

    CM_PRODUCT_SPECIFIC_ERROR
    主要返回代码;发生了特定于产品的错误,并且已记录在产品错误日志中。

    CM_CONVERSATION_TYPE_MISMATCH
    主要返回代码;合作伙伴 LU 或程序不支持分配请求中指定的聊天类型(基本或映射)。

    CM_PIP_NOT_SPECIFIED_CORRECTLY
    主要返回代码;分配请求被非CPI-C LU 6.2 事务程序(TP)拒绝。 合作伙伴计划需要一个或多个 PIP 数据变量,CPI-C 不支持这些变量。

    CM_SECURITY_NOT_VALID
    主要返回代码;合作伙伴 LU 不接受分配请求中指定的用户标识符或密码。

    CM_SYNC_LEVEL_NOT_SUPPORTED_PGM
    主要返回代码;合作伙伴计划不支持分配请求中指定的同步级别。

    CM_TPN_NOT_RECOGNIZED
    主要返回代码;合作伙伴 LU 无法识别分配请求中指定的程序名称。

    CM_TP_NOT_AVAILABLE_NO_RETRY
    主要返回代码;由于永久条件,合作伙伴 LU 无法启动分配请求中指定的计划。 错误的原因可能在远程节点上记录。 在更正错误之前,不要重试分配。

    CM_TP_NOT_AVAILABLE_RETRY
    主要返回代码;由于临时条件,合作伙伴 LU 无法启动分配请求中指定的程序。 错误的原因可能在远程节点上记录。 重试分配。

    CM_PROGRAM_ERROR_PURGING
    主要返回代码;发生以下事件之一:

  • 处于 RECEIVE 或 CONFIRM 状态时,合作伙伴计划已 发出Send_Error。 已清除发送但尚未收到的数据。

  • 虽然处于SEND_PENDING状态且错误方向设置为CM_RECEIVE_ERROR,但合作伙伴计划已 发出Send_Error。 未清除数据。

    CM_RESOURCE_FAILURE_NO_RETRY
    主要返回代码;发生以下事件之一:

  • 由于永久性条件,会话过早终止。 在更正错误之前不要重试。

  • 合作伙伴计划在正常终止之前未解除分配对话。

    CM_RESOURCE_FAILURE_RETRY
    主要返回代码;由于临时情况(如调制解调器故障)而提前终止了会话。 重试对话。

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

  • 远程程序发出 了 Deallocate ,类型参数设置为 CM_DEALLOCATE_ABEND,或者远程 LU 由于远程程序异常结束条件而发出。 如果在发出呼叫时远程程序的会话处于 RECEIVE 状态,则本地程序发送且尚未由远程程序接收的信息将被清除。

  • 远程 TP 已正常终止,但在终止之前未解除分配会话。 远程 LU 上的节点服务代表远程 TP 解除分配了会话。

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

  • 合作伙伴计划发布了 Deallocate ,类型参数设置为ABEND_SVC。

  • 合作伙伴计划在终止之前未解除分配对话。

    如果此呼叫由本地计划发出时,合作伙伴计划的会话处于 RECEIVE 状态,则由本地计划发送且尚未由合作伙伴计划接收的数据被清除。

    CM_DEALLOCATED_ABEND_TIMER
    主要返回代码;会话已解除分配,因为合作伙伴计划已颁发 了“解除分配 ”,类型参数设置为ABEND_TIMER。 如果此呼叫由本地计划发出时,合作伙伴计划的会话处于 RECEIVE 状态,则由本地计划发送且尚未由合作伙伴计划接收的数据被清除。

    CM_SVC_ERROR_PURGING
    主要返回代码;处于 SEND 状态时,合作伙伴计划或合作伙伴 LU 发布了 Send_Error 类型参数设置为 SVC。 发送到合作伙伴计划的数据可能已被清除。

    状态更改

    当程序发出此调用时,会话必须处于 SEND 或SEND_PENDING状态。

    下表汇总了 return_code设置为CM_OK 时可能的状态更改。

send_type 旧状态 新状态
CM_BUFFER_DATA 发送 无更改
CM_BUFFER_DATA SEND_PENDING 发送
CM_SEND_AND_FLUSH 发送 无更改
CM_SEND_AND_FLUSH SEND_PENDING 发送
CM_SEND_AND_CONFIRM 发送 无更改
CM_SEND_AND_CONFIRM SEND_PENDING 发送
CM_SEND_AND_PREP_TO_ RECEIVE 不可用 收到
CM_SEND_AND_DEALLOCATE 不可用 重置

对于CM_PROGRAM_ERROR_PURGING或CM_SVC_ERROR_PURGING的 return_code 值,会话将更改为 RECEIVE 状态。 对于其他非CM_OK值,会话将更改为 RESET 状态。

注解

发生以下情况之一时,本地 LU 发送缓冲区中收集的数据将传输到合作伙伴 LU 和合作伙伴计划:

  • 发送缓冲区将填满。

  • 本地程序发出 刷新确认解除分配 调用或其他刷新 LU 发送缓冲区的调用。 (某些发送类型由 Set_Send_Type设置,包括刷新功能。

    要发送的数据可以是:

  • 映射会话上的完整数据记录。 完整的数据记录是由 send_length 参数指定的长度字符串。

  • 基本对话上的完整逻辑记录或部分。 完整的逻辑记录由 LL 值确定。 (一条逻辑记录可以结束,一个新记录将在要发送的数据字符串中间开始。

    LU 不会对要发送的数据字符串在 ASCII 和 EBCDIC 之间自动执行任何转换。 如有必要,程序可以使用 Common Service Verb (CSV) CONVERT 将字符串从一个字符集转换为另一个字符。