Ошибка mqrc 2018 при вызове удаленного mq с использованием метода MQOPEN PRO * C

Я пытаюсь подключить Remote MQ, используя язык pro * c, при подключении к 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);
  }
}

Для ясности, вы говорите о продукте Oracle, к сожалению, названном Pro * C / C++, верно?

John Bollinger 21.08.2018 14:59

@JohnBollinger да

sudhanshu 21.08.2018 15:01

Поскольку вы говорите, что тот же код, который вы представили, работает где-то еще, я не уверен, что вы ожидаете от нас рассказать вам помимо что говорится в руководстве. Если вы предоставите минимальный воспроизводимый пример, мы сможем сделать больше.

John Bollinger 21.08.2018 15:09

Вы должны проверить журналы администратора очередей для получения дополнительной информации. MQRC 2018 - слишком общая ошибка, чтобы оказать вам реальную помощь.

Attila Repasi 22.08.2018 13:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
1 740
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Код причины MQ 2018 (MQRC_HCONN_ERROR) означает, что ваш параметр Hcon неверен. Ваш код проверяет, является ли CompCodeMQCC_FAILED, но не проверяет наличие MQCC_WARNING. Я предлагаю вам изменить этот тест на следующий: -

if (CompCode != MQCC_OK) {
  printf("MQCONNX ended with reason code |%ld|\n", CReason);
}

Возможно, вы столкнулись с одним из немногих Коды причин MQCC_WARNING, и что Hcon не настроен на тот, который вы ударили.

Хорошая практика - установить для параметра Hcon значение MQHC_UNUSABLE_HCONN перед вызовом MQCONN или MQCONNX, а затем проверить, что параметр 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);
  }
}

Другие вопросы по теме