我正在尝试使用pro * c语言连接远程MQ,而在连接到MQ时,我正在使用MQCONNX和MQOPEN方法,
执行MQOPEN方法后,它将返回错误MQRC 2018.
下面是供参考的代码。
还想知道是否有导致这种身份验证的问题或服务器级别的问题,因为在连接到本地MQ客户端时,具有不同方法的相同代码可以正常工作。
谢谢
int MS_MQ_Open(const char *chr_p_qmname, const char *chr_p_qname,
const char *mode, MQHCONN *Hcon, MQHOBJ *Hobj,
INTL_ENV_DATA_STRUCT_H *p_intlenv_data_struct_h,
DEBUG_INFO_STRUCT_H **l_debug_info_ptr) {
MQOD od = {MQOD_DEFAULT}; /* Object Descriptor */
MQLONG OpenCode; /* MQOPEN completion code */
MQLONG O_options;
MQLONG Reason;
MQLONG CReason;
MQLONG CompCode;
MQCNO mqcno = {MQCNO_DEFAULT}; /* Connection options */
MQCD mqcd = {MQCD_CLIENT_CONN_DEFAULT}; /* Channel Defs */
MQCSP csp = {MQCSP_DEFAULT};
MQCHAR chr_l_qmname[MQ_Q_MGR_NAME_LENGTH];
char userId[50];
char password[50];
strncpy(userId, "XXXXXX", 50);
strncpy(chr_l_qmname, chr_p_qmname, MQ_Q_MGR_NAME_LENGTH);
strncpy(mqcd.ConnectionName, "10.000.00.00(port number)",
MQ_CONN_NAME_LENGTH);
strncpy(mqcd.ChannelName, "SVRCONN", MQ_CHANNEL_NAME_LENGTH);
mqcno.SecurityParmsPtr = &csp;
mqcno.Version = MQCNO_VERSION_5;
csp.AuthenticationType = MQCSP_AUTH_USER_ID_AND_PWD;
csp.CSPUserIdPtr = userId;
csp.CSPUserIdOffset = 0;
csp.CSPUserIdLength = strlen(userId);
strncpy(password, "XXXX", 50);
csp.CSPPasswordPtr = password;
csp.CSPPasswordOffset = 0;
csp.CSPPasswordLength = strlen(password);
mqcno.ClientConnPtr = &mqcd;
mqcno.Version = MQCNO_VERSION_5;
MQCONNX(chr_l_qmname, &mqcno, &Hcon, &CompCode, &CReason);
if (CompCode == MQCC_FAILED) {
printf("MQCONNX ended with reason code |%ld|\n", CReason);
}
strncpy(od.ObjectName, chr_p_qname, (size_t)MQ_Q_NAME_LENGTH);
if (!strcmp(mode, "I")) {
O_options = MQOO_INQUIRE + MQOO_FAIL_IF_QUIESCING;
} else if (!strcmp(mode, "O")) {
O_options = MQOO_OUTPUT /* open queue for output */
+ MQOO_FAIL_IF_QUIESCING +
MQOO_SET_ALL_CONTEXT; /* but not if MQM stopping */
} else {
printf("Invalid mode %s\n", mode);
APL_GOBACK_FAIL
}
MQOPEN(Hcon, &od, O_options, &Hobj, &OpenCode, &Reason);
if (Reason != MQRC_NONE) {
printf("MQOPEN ended with reason code |%ld|\n", Reason);
}
}
答案 0 :(得分:1)
MQ原因码2018(MQRC_HCONN_ERROR)表示您的Hcon
参数不正确。您的代码测试CompCode
是否为MQCC_FAILED
,但不检查MQCC_WARNING
。我建议您将此测试更改为以下内容:-
if (CompCode != MQCC_OK) {
printf("MQCONNX ended with reason code |%ld|\n", CReason);
}
您可能遇到了少数几个MQCC_WARNING
reason codes之一,而没有为您命中的那个设置Hcon
。
优良作法是,在调用MQCONN或MQCONNX之前,将Hcon
参数设置为值MQHC_UNUSABLE_HCONN,然后测试Hcon
参数是否不再设置为该值,然后再进行调用。调用类似MQOPEN之类的东西。这将意味着您可以确定MQCONN(X)调用将Hcon
参数设置为不应导致2018的值。
if (Hcon != MQHC_UNUSABLE_HCONN)
{
MQOPEN(Hcon, &od, O_options, &Hobj, &OpenCode, &Reason);
if (Reason != MQRC_NONE) {
printf("MQOPEN ended with reason code |%ld|\n", Reason);
}
}