MQRC_Q_MGR_NAME_ERROR

Недавно я работал над решением, которое интегрируется с серией MQ, и не могу понять, что не так с моим решением. По сути, я пытаюсь подключиться к серверу MQ на мейнфрейме через API MQCONNX, но получаю ошибку 2058.

Вот основной код:

#include <iostream>
#include <cstring>
#include <cmqc.h>
#include <cmqxc.h>

int main(int argc, char** argv) 
{
    if (argc != 6) {
        std::cerr << "Wrong parameters" << std::endl;
        return -1;
    }

    char* queue_manager_name = argv[1]; // maq
    char* channel_name       = argv[2]; // MQCanal
    char* connection_name    = argv[3]; // MQConexion
    char* transport_type     = argv[4]; // MQTransport

    std::cout << "Trying connection with parameters:\n";
    std::cout << "\tQueue Manager Name (maq)         :" << queue_manager_name << std::endl;
    std::cout << "\tChannel Name       (MQCanal)     :" << channel_name << std::endl;
    std::cout << "\tConnection Name    (MQConexion)  :" << connection_name << std::endl;
    std::cout << "\tTransport Type     (MQTransporte):" << transport_type << std::endl;

    // connection
    MQCD connection_description = { MQCD_CLIENT_CONN_DEFAULT };
    strncpy(connection_description.ChannelName, channel_name, MQ_CHANNEL_NAME_LENGTH);
    strncpy(connection_description.ConnectionName, connection_name, MQ_CONN_NAME_LENGTH);
    strncpy(connection_description.QMgrName, queue_manager_name, MQ_Q_MGR_NAME_LENGTH);
    
    if (strcmp(transport_type, "TCP") == 0) {
        connection_description.TransportType = MQXPT_TCP;
    } else if (strcmp(transport_type, "UDP") == 0) {
        connection_description.TransportType = MQXPT_UDP;
    } else if (strcmp(transport_type, "LU62") == 0) {
        connection_description.TransportType = MQXPT_LU62;
    } else {
        std::cerr << "Invalid transport type, valids are TCP | UDP | LU62" << std::endl;
        return -1;
    }

    MQHCONN conn_handle;
    MQLONG comp_code;
    MQLONG reason;
    MQCNO  connection Options = { MQCNO_DEFAULT };
    connection_options.ClientConnPtr = &connection_description;
    connection_options.Version = MQCNO_VERSION_2;

    MQCONNX(queue_manager_name, &connection Options, &conn_handle, &comp_code, &reason);

    if (comp_code == MQCC_FAILED) {
        std::cerr << "Error to connect against MQ - reason code: " << reason << std::endl;
        return -1;
    }

    MQDISC(&conn_handle, &comp_code, &reason);

    return 0;
}

Эта небольшая программа всегда получает ошибку 2058, указывающую, что имя диспетчера очереди неверно или не существует. Но на самом деле существуют и другие приложения, реализованные на других языках (например, Java), подключающиеся к MQ Server и использующие те же параметры.

Среда

Это приложение работает на Solaris 11, и даже несмотря на то, что я использую C API, мой компилятор — g++ (gcc), а ниже — мой make-файл:

CXX = g++
CXXFLAGS = -std=c++98 -pedantic -Wall -Wextra -Wunused-parameter -Wwrite-strings -g -fpermissive -I/usr/include -I/opt/mqm/inc
MQM_LIB = /opt/mqm/lib64
LDFLAGS = -lrt -L$(MQM_LIB) -lmqm
SRCS = src/main.cpp
OBJS = $(SRCS:.cpp=.o)
DIST_FOLDER = dist
TARGET = $(DIST_FOLDER)/mq
RUNTIME_FOLDER = runtime

all: pre-build $(TARGET) copy_runtime

$(TARGET): $(OBJS)
    $(CXX) -o $@ $^ $(LDFLAGS)

src/%.o: src/%.cpp
    $(CXX) $(CXXFLAGS) -c -o $@ $<

pre-build:
    @mkdir -p $(DIST_FOLDER)

clean:
    @rm -rf $(DIST_FOLDER)
    @rm -f $(OBJS) $(TARGET)

copy_runtime:
    @cp $(TARGET) runtime/.

Я не могу понять, в чем проблема. Цените любую помощь.

Проверьте AMQERR01.LOG на своем клиентском компьютере.

JoshMc 15.03.2024 21:00
Стоит ли изучать 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
1
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Чтобы подключиться к администратору очередей на другом компьютере, необходимо использовать клиентское соединение.

Пожалуйста, добавьте следующую строку кода перед звонком MQCONNX.

connection_options.Options |= MQCNO_CLIENT_BINDING;

Альтернативно, но не обязательно в современных версиях MQ из-за вышеизложенного, ссылка на библиотеку mqic.

Или, альтернативно, вообще не вносите изменений в код и установите для переменной среды MQ_CONNECT_TYPE значение CLIENT.

Perfect Morag, единственная разница в том, что заданное значение — MQCNO_CLIENT_BINDING вместо MQCNO_CLIENT, по крайней мере, в версии, которую я использую. Очень ценю вашу поддержку. Есть ли у вас аналогичный пример с использованием объектно-ориентированного API, более современного подхода, поскольку остальная часть приложения реализована на C++, а не на языке C. Заранее спасибо!

filosofisto 15.03.2024 22:38

Вы совершенно правы. Я внес исправление. Я записал ответ по памяти, так как в тот момент меня не было за компьютером. Рад, что был достаточно близко, чтобы разобраться с тобой!

Morag Hughson 16.03.2024 08:33

MQ поставляется с примерами на C и C++. Я пишу на C, поэтому у меня нет образцов C++. Было ли что-то еще, в чем вам нужна была помощь? Поднимите еще один вопрос, и мы сможем помочь вам в дальнейшем.

Morag Hughson 16.03.2024 08:35

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