RECEIVE_ALLOCATE_EX谓词接受新的 VCB 结构,以允许注册附加管理器。
语法
typedef struct receive_allocate_ex {
unsigned short opcode;
unsigned char opext;
unsigned char format;
unsigned short primary_rc;
unsigned long secondary_rc;
unsigned char tp_name[64];
unsigned char tp_id[8];
unsigned long conv_id;
unsigned char sync_level;
unsigned char conv_type;
unsigned char user_id[10];
unsigned char lu_alias[8];
unsigned char plu_alias[8];
unsigned char mode_name[8];
unsigned char reserv3[2];
unsigned long conv_group_id;
unsigned char fqplu_name[17];
unsigned char pip_incoming;
unsigned long timeout;
unsigned char password[10];
unsigned char reserv5[2];
unsigned char attach_id[8];
}
成员
opcode
提供的参数:RECEIVE_ALLOCATE_EX
opext
提供的参数。 指定谓词作扩展,AP_BASIC_CONVERSATION。
format
保留参数。
primary_rc
返回的参数。 指定 APPC 在谓词完成时设置的主要返回代码。 有效的返回代码因发布的 APPC 谓词而异。
secondary_rc
返回的参数。 指定 APPC 在谓词完成时设置的辅助返回代码。 有效的返回代码因发布的 APPC 谓词而异。
tp_name
提供的参数。
tp_name只是返回的参数。 但是,应用程序必须分配足够的缓冲区空间来保存 tp_name (即 64 个字符),并将名称初始化为 EBCDIC 空格(十六进制 X'40')
返回的谓词将包含远程系统发送的实际 TP 名称。
tp_id
返回的参数。 标识本地 TP。
conv_id
返回的参数。 提供会话标识符。 它标识两个合作伙伴 TP 之间已建立的对话 APPC。
sync_level
返回的参数。 指定会话的同步级别。 它确定 TP 是否可以请求确认接收数据并确认接收数据。
AP_NONE 指定不会在此会话中使用确认处理。
AP_CONFIRM_SYNC_LEVEL 指定 TP 可以在此会话中使用确认处理。
AP_SYNCPT 指定 TP 可在此会话中使用同步点级别 2 确认处理。
conv_type
返回的参数。 使用 MC_ALLOCATE 或 ALLOCATE 指定合作伙伴 TP 选择的对话类型。 以下是可能的值:AP_BASIC_CONVERSATION
AP_MAPPED_CONVERSATION
user_id
这是远程系统发送的 EBCDIC user_idlu_alias
提供的参数。 本地 LU 别名。 必须提供以注册附加管理器。 主机集成服务器子域中只能为给定的本地 LU 别名注册一个附加管理器。 如果已为此lu_alias注册另一个附加管理器进程,将返回以下错误:primary_rc = AP_STATE_CHECK (0x0002) secondary_rc = AP_LU_ALREADY_REGISTERED (0x0000050A)
这表示 Host Integration Server 无法注册此附加管理器。
plu_alias
返回的参数。 提供合作伙伴 LU(已启动传入分配)已知到本地 TP 的别名。 它是 ASCII 字符串。mode_name
返回的参数。 在合作伙伴 TP 中提供 由MC_ALLOCATE 或 ALLOCATE 指定的模式名称。 它是配置期间定义的一组网络特征的名称。 mode_name是类型 A EBCDIC 字符串。reserv3
保留参数。conv_group_id
对话组标识符。fqplu_name
此返回的参数提供完全限定的 LU 名称。pip_incoming
提供的参数。 如果此附加管理器将接受包含 PIP 数据的传入 FMH-5 附加,则将此设置为 AP_YES。 否则,请将此项设置为 AP_NO。返回的参数:如果传入附加中存在 PIP 数据,则设置为 AP_YES。 如果没有 PIP 数据,则会将其设置为 AP_NO。
timeout
超时(以秒为单位)。 值0xFFFFFFFF可用于永远等待。password
返回的参数:这是远程系统发送的 EBCDIC 密码。 如果远程系统支持“密码替换”(密码加密),则会在 RECEIVE_ALLOCATE_EX接收加密的密码。 没有解密此密码的设施,因此应用程序将无法验证用户凭据。reserv5
保留参数。attach_id
返回的参数。 始终设置为 0。 此字段是为与非Microsoft SNA 产品的源兼容性定义的。
注解
Host Integration Server 支持 APPC RECEIVE_ALLOCATE_EX 和 RECEIVE_ALLOCATE_EX_END ,以简化某些可调用事务程序的设计和实现。 此函数允许 APPC 应用程序接收主机集成服务器通过特定本地 APPC LU 接收的所有传入 FMH-5 附加请求,从而允许应用程序充当“附加管理器”。附加管理器是处理传入 FMH-5 附加请求以启动 LU6.2 对话的程序。 当 APPC 应用程序调用 RECEIVE_ALLOCATE (而不是 RECEIVE_ALLOCATE_EX),Host Integration Server 处理附加管理器功能。 若要在 APPC 应用程序中实现附加管理器功能,将发生以下情况:
应用程序为 RECEIVE_ALLOCATE_EX 函数提供本地 APPC LU 别名,其中包含 EBCDIC 空格(十六进制 X'40')的tp_name。
当 Host Integration Server 使用该本地 APPC LU 通过 LU6.2 会话接收传入 FMH-5 附加请求时,Host Integration Server 会将请求路由到应用程序。
RECEIVE_ALLOCATE_EX完成后,应用程序负责以下各项:
接受或拒绝 FMH-5 附加
验证任何聊天级别安全性,以及
如果接受附加请求,请完全处理其 Win32 进程上下文中的请求。
若要停止侦听新的传入附加请求,应用程序 会调用RECEIVE_ALLOCATE_EX_END。
在 进程RECEIVE_ALLOCATE_EX出现问题后,进程不应调用具有特定 TP 名称 的RECEIVE_ALLOCATE 。 同样,如果进程 调用RECEIVE_ALLOCATE,则此过程不应稍后 调用RECEIVE_ALLOCATE_EX。 换句话说,在支持可调用 TP 的进程期间,进程应专门调用 RECEIVE_ALLOCATE或 RECEIVE_ALLOCATE_EX,但不应同时调用这两者。
应用程序无法将传入的附加请求调度到另一个进程,因为会话 ID 仅在其自己的应用程序上下文中有效。
注释
:主机集成服务器不支持自动启动附加管理器应用程序。 换句话说,如果应用程序 调用RECEIVE_ALLOCATE_EX,则必须在任何传入的 Attach 请求通过本地 LU 到达之前启动该应用程序。
当前规范不返回安全指示器(FMH-5 附加的字节 4)。 因此,应用程序需要适应包含以下项的传入附加请求:
user_id或密码(在附加中未发送安全时),
仅user_id(例如“已验证”附加),或
user_id和密码(如果需要用户授权)。
在 LU6.2 BIND 请求中,Host Integration Server 表示支持传入 FMH-5 附加请求,这些请求包含用户安全性、已验证和密码替换。 Host Integration Server 不支持请求持久验证的传入附加。
如果tp_name设置为所有 EBCDIC 空格(X'40'),并在lu_alias字段中提供本地 LU 别名, 则RECEIVE_ALLOCATE_EX 函数允许应用程序注册为附加管理器。 注册为给定lu_alias的附加管理器时,Host Integration Server 会将通过lu_alias接收的所有传入附加路由到应用程序。 有关 Host Integration Server 如何路由传入 FMH-5 附加请求的详细信息,请参阅下文。
应用程序可以多次调用 RECEIVE_ALLOCATE_EX 以注册为一个或多个本地 LU 的附加管理器。 但是,在 SNA 子域中的给定lu_alias上只能注册一个附加管理器(即在所有主机集成服务器和附加的 Host Integration Server 客户端上)。 应用程序无法提供空白tp_name和空白lu_alias。 换句话说,应用程序无法注册为默认附加管理器,以接收 SNA 子域的所有传入附加请求。
RECEIVE_ALLOCATE_EX完成后,应用程序负责以下事项:
确定是否将接受附加。 Host Integration Server 不提供配置事务程序(TP)的机制。 应用程序必须有自己的方法来定义它将支持的 tp 名称。
如果接受,应用程序必须验证会话安全属性(user_id、密码)以及处理新会话的处理。
无法将tp_id和conv_id传递给单独的处理过程。 应用程序必须提供所有 TP 处理。
如果应用程序选择拒绝附加请求,则必须调用 [MC_]DEALLOCATE ,并使用这些新的扩展代码指定在已完成 的RECEIVE_ALLOCATE_EX中收到的conv_id,以及dealloc_type参数中的相应原因代码:
#define AP_DEALLOC_SECURITY_NOT_VALID_PASSWORD_EXPIRED 0x10
#define AP_DEALLOC_SECURITY_NOT_VALID_PASSWORD_INVALID 0x11
#define AP_DEALLOC_SECURITY_NOT_VALID_USERID_REVOKED 0x12
#define AP_DEALLOC_SECURITY_NOT_VALID_USERID_INVALID 0x13
#define AP_DEALLOC_SECURITY_NOT_VALID_USERID_MISSING 0x14
#define AP_DEALLOC_SECURITY_NOT_VALID_PASSWORD_MISSING 0x15
#define AP_DEALLOC_SECURITY_NOT_VALID_GROUP_INVALID 0x16
#define AP_DEALLOC_SECURITY_NOT_VALID_USERID_REVOKED_IN_GROUP 0x17
#define AP_DEALLOC_SECURITY_NOT_VALID_USERID_NOT_DEFD_TO_GROUP 0x18
#define AP_DEALLOC_SECURITY_NOT_VALID_NOT_AUTHORIZED_AT_REMOTE_LU 0x19
#define AP_DEALLOC_SECURITY_NOT_VALID_NOT_AUTHORIZED_FROM_LOCAL_LU 0x1A
#define AP_DEALLOC_SECURITY_NOT_VALID_NOT_AUTHORIZED_TO_TRANSACTION_PROGRAM 0x1B
#define AP_DEALLOC_SECURITY_NOT_VALID_INSTALLATION_EXIT_FAILED 0x1C
#define AP_DEALLOC_SECURITY_NOT_VALID_PROCESSING_FAILURE 0x1D
#define AP_DEALLOC_SECURITY_NOT_VALID_PROTOCOL_VIOLATION 0x1E
当应用程序设置上述dealloc_type时,主机集成服务器会在拒绝 FMH-5 附加请求时在发送到远程系统的 FMH-7 错误中发送相应的感知代码:
#define AP_SECURITY_NOT_VALID_PASSWORD_EXPIRED APPC_FLIPL(x080fff00)
#define AP_SECURITY_NOT_VALID_PASSWORD_INVALID APPC_FLIPL(x080fff01)
#define AP_SECURITY_NOT_VALID_USERID_REVOKED APPC_FLIPL(x080fff02)
#define AP_SECURITY_NOT_VALID_USERID_INVALID APPC_FLIPL(x080fff03)
#define AP_SECURITY_NOT_VALID_USERID_MISSING APPC_FLIPL(x080fff04)
#define AP_SECURITY_NOT_VALID_PASSWORD_MISSING APPC_FLIPL(x080fff05)
#define AP_SECURITY_NOT_VALID_GROUP_INVALID APPC_FLIPL(x080fff06)
#define AP_SECURITY_NOT_VALID_USERID_REVOKED_IN_GROUP APPC_FLIPL(x080fff07)
#define AP_SECURITY_NOT_VALID_USERID_NOT_DEFD_TO_GROUP APPC_FLIPL(x080fff08)
#define AP_SECURITY_NOT_VALID_NOT_AUTHORIZED_AT_REMOTE_LU APPC_FLIPL(x080fff09)
#define AP_SECURITY_NOT_VALID_NOT_AUTHORIZED_FROM_LOCAL_LU APPC_FLIPL(x080fff0A)
#define AP_SECURITY_NOT_VALID_NOT_AUTHORIZED_TO_TRANSACTION_PROGRAM APPC_FLIPL(x080fff0B)
#define AP_SECURITY_NOT_VALID_INSTALLATION_EXIT_FAILED APPC_FLIPL(x080fff0C)
#define AP_SECURITY_NOT_VALID_PROCESSING_FAILURE APPC_FLIPL(x080fff0D)
#define AP_SECURITY_NOT_VALID_PROTOCOL_VIOLATION APPC_FLIPL(x080fff0E)
在调用 RECEIVE_ALLOCATE_EX之前,应用程序可能需要验证本地 APPC LU 的配置设置,以确定 LU 是否支持同步级别 2,还是默认 LU 池的成员。 为此,请使用增强 GET_LU_STATUS API。
若要取消注册为给定本地 APPC LU 的附加管理器,应用程序必须调用 下面所述的RECEIVE_ALLOCATE_EX_END。 如果应用程序已注册为多个lu_alias的附加管理器,则必须为每个lu_alias调用 RECEIVE_ALLOCATE_EX_END 。
应用程序应尝试 随时RECEIVE_ALLOCATE_EX挂起 ,以便及时处理传入的附加请求。 如果应用程序无法发布新的 RECEIVE_ALLOCATE_EX,则 Host Integration Server 将针对应用程序排队最多 2,048 个传入附加,如果应用程序在 Host Integration Server 上运行,则为 256(如果在 HIS 客户端上运行)。 如果超出限制,Host Integration Server 会拒绝具有感知代码 X'084B6031' 的附加请求,或 AP_TRANS_PGM_NOT_AVAIL_RETRY。