IBM MQ MQCONN 从主机到 Docker 容器

IBM MQ MQCONN from host to Docker container

尝试从 C 应用程序 运行 作为主机上的 IBM MQ 客户端连接到作为 docker 容器的 MQ 服务器 运行。

下面提供了从 IBM 示例中获取的客户端代码。 问题是在没有提供 IP/port 的情况下调用 MQCONN 时使用哪个协议?我只能猜测它是某种 IPC。 出于这个原因,我是 运行 带有 --ipc="host" 选项的 docker 容器,但它仍然失败,CompCode=2,Reason=2058

#include <cmqc.h>
⋮
static char Parm1[MQ_Q_MGR_NAME_LENGTH] ;
⋮
int  main(int argc, char *argv[] )
   {
   /*                                                    */
   /*     Variables for MQ calls                         */
   /*                                                    */
   MQHCONN Hconn;      /* Connection handle              */
   MQLONG  CompCode;   /* Completion code                */
   MQLONG  Reason;     /* Qualifying reason              */
⋮
   /* Copy the queue manager name, passed in the         */
   /* parm field, to Parm1                               */
   strncpy(Parm1,argv[1],MQ_Q_MGR_NAME_LENGTH);
⋮
   /*                                                    */
   /* Connect to the specified queue manager.            */
   /*   Test the output of the connect call.  If the     */
   /*   call fails, print an error message showing the   */
   /*   completion code and reason code, then leave the  */
   /*   program.                                         */
   /*                                                    */
   MQCONN(Parm1,
          &Hconn,
          &CompCode,
          &Reason);
   if ((CompCode != MQCC_OK) | (Reason != MQRC_NONE))
      {
      sprintf(pBuff, MESSAGE_4_E,
              ERROR_IN_MQCONN, CompCode, Reason);
      PrintLine(pBuff);
      RetCode = CSQ4_ERROR;
      goto AbnormalExit2;
      }
⋮
   }

如果您的程序 运行 与队列管理器在同一台服务器上,那么最好 link 使用 'mqm.lib'(绑定模式)而不是 'mqic.lib' ](客户端模式)。

MQ KnowLedge Center 中,有关于如何编译和 link 您的 C 程序的示例。示例列为:'C client application'(客户端模式)和'C server application'(绑定模式)。

如果将来您的 C 程序需要连接到远程队列管理器,那么您需要 link 它 'client mode'。

要配置您的 C 程序以处理适当的 MQ 安全性,请将 MQCONN API 调用更改为 MQCONNX API 调用。

MQCNO   cno   = {MQCNO_DEFAULT};
MQCD    cd    = {MQCD_CLIENT_CONN_DEFAULT};
MQCSP   csp = {MQCSP_DEFAULT};

strncpy(cd.ConnectionName, hostname, MQ_CONN_NAME_LENGTH);
strncpy(cd.ChannelName, channelName, MQ_CHANNEL_NAME_LENGTH);

csp.AuthenticationType = MQCSP_AUTH_USER_ID_AND_PWD;

csp.CSPUserIdPtr = &myUserId;
csp.CSPUserIdOffset = 0;
csp.CSPUserIdLength = strlen(myUserId);

csp.CSPPasswordPtr = &myPassword;
csp.CSPPasswordOffset = 0;
csp.CSPPasswordLength = strlen(myPassword);

cno.cdPtr = &cd;
cno.Version = MQCNO_CURRENT_VERSION;
cno.SecurityParmsPtr = &csp;
cno.SecurityParmsOffset = 0;

MQCONNX(QMgrName, &cno, &Hcon, &CompCode, &Reason);

几年前,我写了一篇博文,名为:MQ API Verbs that IBM Forgot!!。我为 MQCONN 和 MQCONNX 创建了包装,这将允许程序为 MQCONN 和 MQCONNX API 调用传递 UserId 和密码。您可能会发现简单地使用包装器会更容易。