使用MQOPEN方法PRO * C调用远程mq时出现mqrc 2018错误

时间:2018-08-21 12:40:18

标签: c ibm-mq mq oracle-pro-c

我正在尝试使用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);
  }
}

1 个答案:

答案 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);
  }
}