在 C# 中连接到 Websphere MQ 有效,但在 C++ 中失败,代码为 2058 (MQRC_Q_MGR_NAME_ERROR)

Posted

技术标签:

【中文标题】在 C# 中连接到 Websphere MQ 有效,但在 C++ 中失败,代码为 2058 (MQRC_Q_MGR_NAME_ERROR)【英文标题】:Connecting to Websphere MQ in C# works, but fails in C++ with code 2058 (MQRC_Q_MGR_NAME_ERROR) 【发布时间】:2017-07-31 16:21:04 【问题描述】:

我需要编写一段代码来使用 C++ 将消息放入 MQ。当我在 localhost 上测试它时,使用默认端口(1414)它可以工作。但是,在使用特定通道定义和不同端口(1420)的实际环境中,它会失败,原因代码为 2058 / MQRC_Q_MGR_NAME_ERROR。 使用 Websphere MQ Explorer 连接到远程 MQ 没有问题。在 C# 应用程序中连接到同一个远程服务器以证明连接性也没有问题。有什么想法可能导致它吗?

一些示例代码摘录:调用 .connect() 时失败的 C++...

ImqChannel * pChannel_ = 0;  // Channel definition which is at class level
ImqQueueManager queueManager_;   // Queue Manager, also declared at class level


// extract from the MQHelper::Connect() method... 
int MQClient::Connect() 
   pChannel_ = new ImqChannel;
   pChannel_->setChannelName("CLCHL.QM");
   pChannel_->setTransportType(MQXPT_TCP);
   pChannel_->setConnectionName("10.2.3.4(1420)");
   // Should we set this???! pChannel_->setModeName("to what?");

   queueManager_.setName("QM");
   queueManager_.setChannelReference(pChannel_);

   if (!queueManager_.connect()) 
      // ERROR IS HERE: _lastCompletionCode is 2, _lastReasonCode is 2058
      _lastCompletionCode = queueManager_.completionCode();
      _lastReasonCode = queueManager_.reasonCode();
      return (int)_lastReasonCode;
   
    // If we get here, we're all good:
   return 0;

在C#中,没有这样的问题:下面的代码可以正常连接..

queueManager = new MQQueueManager("QM", "CLCHL.QM", "10.2.3.4(1420)");

其他信息:

Server MQ 安装为 7.0.1.0 Websphere MQ Explorer 版本: 7.5.0.1(在这里连接没问题)在 C# 应用程序中,我只引用 amqmdnet.dll ......一切都很好。 在 C++ 应用程序中,我为 26 个不同的 mq .h 或 .hpp 文件设置了外部依赖项。 我还包含了适当的库等...再次 - 我知道它是 能够像它一样工作,相同的代码将指向一个 本地主机队列管理器。 我正在使用 VS 2017

有什么想法吗?

【问题讨论】:

QM 名称不是必填字段。您可以尝试删除 QM 名称,看看它是否有效 嗨,我注释掉了 .setName("QM") 语句。这导致原因代码为 2059 / MQRC_Q_MGR_NAME_ERROR。所以那里没有快乐。 c#应用程序和c++应用程序的唯一区别可能是“setTransportType(MQXPT_TCP);” "setTransportType(MQXPT_TCP);" - 这是正确的 - 有关程序的编译/链接,请参阅下面的 cmets。 【参考方案1】:
ImqChannel * pChannel_ = 0;  // Channel definition which is at class level
ImqQueueManager queueManager_;   // Queue Manager, also declared at class level

变量名中多余的下划线是什么意思?

queueManager_.setName("QM");

这是远程队列管理器的实际队列管理器名称吗?它必须是正确的值。注意:MQ 区分大小写。 IE。 “QM”与“qm”不同。

每个队列管理器的侦听器侦听不同的端口。

pChannel_->setConnectionName("10.2.3.4(1420)");

您确定队列管理器“QM”实际上是在侦听端口 1420 而不是 1414、1419 或 1421 等。

【讨论】:

下划线是实际的变量名——结尾的下划线只是我添加到现有代码时遵循的约定。我意识到这有点奇怪。 “QM”绝对正确。并且在办公环境下端口是1420(我在localhost主机上测试的时候,明显是默认的1414)。这已在 C# 应用程序中得到证明,我编写该应用程序只是为了证明连接是可能的。 防火墙?您是否在与 C++ 程序相同的 PC/服务器上运行 C# 程序? 另外,您是如何编译/链接 C++ 程序的?您是否将它与客户端或服务器库链接?请参阅ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.dev.doc/… - 注意第二个库的第 4 个字符是客户端的“c”和服务器的“s”。确保您使用的是客户端库。 这是我出错的地方。我没有在项目属性中包含正确的库。现在工作。谢谢。

以上是关于在 C# 中连接到 Websphere MQ 有效,但在 C++ 中失败,代码为 2058 (MQRC_Q_MGR_NAME_ERROR)的主要内容,如果未能解决你的问题,请参考以下文章

连接到 IBM Websphere MQ 时出现 NullPointerException

将 Apache ServiceMix 连接到 Websphere MQ

谁能告诉我一种使用用户提供的服务从云铸造厂连接到 Websphere MQ 的方法

在 C# 中连接到 SQL Server 时出现问题

在 C# 中连接到 MySql 数据库

尝试在 C# 中连接到 Oracle DB 时出现问题