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 和密码。您可能会发现简单地使用包装器会更容易。
尝试从 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 和密码。您可能会发现简单地使用包装器会更容易。