首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MQOPEN方法PRO*C调用远程mq时出错

使用MQOPEN方法PRO*C调用远程mq时出错
EN

Stack Overflow用户
提问于 2018-08-21 12:40:18
回答 1查看 2.7K关注 0票数 0

我试图使用pro*c语言连接远程MQ,同时使用MQCONNX和MQOPEN方法连接到MQ,

在执行MQOPEN方法之后,它返回一个错误MQRC 2018。

下面的是供参考的代码.

还想知道是否存在任何导致这种情况的身份验证问题或服务器级别问题,因为具有不同方法的相同代码在连接到本地MQ客户端时运行良好。

谢谢

代码语言:javascript
复制
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);
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-22 11:41:29

MQ原因代码2018 (错误)意味着您的Hcon参数不正确。您的代码测试的CompCodeMQCC_FAILED,但不检查MQCC_WARNING。我建议您将此测试改为:-

代码语言:javascript
复制
if (CompCode != MQCC_OK) {
  printf("MQCONNX ended with reason code |%ld|\n", CReason);
}

您可能遇到了少数几个原因码之一,并且Hcon没有设置为您所命中的那个。

良好做法是在调用MQCONN或MQCONN之前将Hcon参数设置为值MQHC_UNUSABLE_HCONN,然后在调用类似于MQOPEN的内容之前测试Hcon参数不再设置为该值。这意味着您可以确定您的MQCONN(X)调用将Hcon参数设置为不会导致2018年的事件。

代码语言:javascript
复制
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);
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51948901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档