我的带有MQ的C接收消息返回码2037

我运行C程序,它连接到MQ并尝试从中获取消息。 我总是收到一条消息:
MQGET以原因代码2037结束
这意味着MQ未打开,但MQOPEN CC = 0 RC = 0

MQ错误日志为空。

这是该计划

#include  #include  #include  #include  /* includes for MQI*/ #include  int main(int argc, char **argv) { MQCNO Connect_options = {MQCNO_DEFAULT};/MQNONNX opt*/ MQCD ClientConn = {MQCD_CLIENT_CONN_DEFAULT};/*client channel*/ MQHCONN Hcon; /* connection handle */ MQHOBJ Hobj; /* object handle */ MQLONG CompCode; /* completion code */ MQLONG OpenCode; /* MQOPEN completion code*/ MQLONG Reason; /* reason code */ MQOD od = {MQOD_DEFAULT}; /* Object Descriptor */ MQMD md = {MQMD_DEFAULT}; /* Message Descriptor */ MQPMO pmo = {MQPMO_DEFAULT}; /* put message options*/ MQLONG O_options; /* MQOPEN options */ MQLONG C_options; /* MQCLOSE options */ MQGMO gmo = {MQGMO_DEFAULT}; /* get message options */ char QMgrName[MQ_Q_MGR_NAME_LENGTH+1]; char QName[MQ_Q_NAME_LENGTH+1]; char channelName[MQ_CHANNEL_NAME_LENGTH+1]; char hostname[1024]; char port[4]; MQLONG buflen; /* buffer length*/ char TempBuf[65536]; int msgsToGet; int msgsGot; if (argc != 6) { printf("Usage: MQTest11 QMgrName ChlName hostname port QName\n"); return(1); } **/* copy MQ manager name */** strncpy(QMgrName, argv[1], MQ_Q_MGR_NAME_LENGTH); QMgrName[MQ_Q_MGR_NAME_LENGTH] = '\0'; **/* copy channel name */** strncpy(channelName, argv[2], MQ_CHANNEL_NAME_LENGTH); channelName[MQ_CHANNEL_NAME_LENGTH] = '\0'; **/* copy hostname */** strncpy(hostname, argv[3], 1023); hostname[1023] = '\0'; **/* copy port number */** strncpy(port,argv[4],4); strncpy(QName, argv[5], MQ_Q_NAME_LENGTH); QName[MQ_Q_NAME_LENGTH] = '\0'; **/* copy hostname for connection */** strncpy(ClientConn.ConnectionName,hostname, MQ_CONN_NAME_LENGTH); **/* copy channel name */** strncpy(ClientConn.ChannelName,channelName,MQ_CHANNEL_NAME_LENGTH); **/* Point the MQCNO to the client connection definition */** Connect_options.ClientConnPtr = &ClientConn; Connect_options.Version = MQCNO_VERSION_2; **/* use MQCONNX */** if (CompCode == MQCC_FAILED) { /* exit with print the reason */ } else { strncpy(od.ObjectName, QName, (size_t)MQ_Q_NAME_LENGTH); O_options = MQOO_OUTPUT + MQOO_FAIL_IF_QUIESCING; MQOPEN(Hcon, /* connection handle */ &od, /* object descriptor for queue */ O_options, /* open options */ &Hobj, /* object handle */ &OpenCode, /* MQOPEN completion code */ &Reason); /* reason code */ printf("MQTest11 MQOPEN CC=%ld RC=%ld\n", CompCode, Reason); if (OpenCode == MQCC_OK) /* if MQOPEN , then continue in the while loop */ { gmo.Options = MQGMO_WAIT + MQGMO_CONVERT; gmo.WaitInterval = 15000; msgsGot = 0; msgsToGet = 0; CompCode = OpenCode; } while (CompCode != MQCC_FAILED && ((msgsToGet == 0) || (msgsGot < msgsToGet))) { /* define length of the buffer -1 */ buflen = strlen(TempBuf) - 1; */ buffer length */ memcpy(md.MsgId, MQMI_NONE, sizeof(md.MsgId)); /*copy msg ID*/ memcpy(md.CorrelId, MQCI_NONE, sizeof(md.CorrelId));/*copy corrlID*/ md.Encoding = MQENC_NATIVE; /*encode*/ md.CodedCharSetId = MQCCSI_Q_MGR; /* function to get message from MQ*/ MQGET(Hcon, /* get message from MQ */ Hobj, /* object handle*/ &md, /* message descriptor*/ &gmo, /*get message options*/ buflen, /*buffer length*/ TempBuf, /* buffer */ &messlen, /* message length*/ &CompCode, /* completion code*/ &Reason); /* reason code*/ **/* I put some statements to check if transaction failed or not*/** if (Reason != MQRC_NONE) { if (Reason == MQRC_NO_MSG_AVAILABLE) { /* print statement no more messages */ else { printf("MQGET ended with reason code %d comcode %d\n",Reason,CompCode); if (Reason == MQRC_TRUNCATED_MSG_FAILED) { /print statement that it is failed*/ } } } **This is almost done, only statement if Compcode not failed, then print buffer** 

我已将char TempBuf声明更改为MQBYTE,但它没有帮助

MQRC 2037是MQRC_NOT_OPEN_FOR_INPUT,您可以通过运行随IBM MQ Client或服务器安装提供的mqrc命令来查找此信息,下面是Linux服务器上的示例输出:

 $ mqrc 2037 2037 0x000007f5 MQRC_NOT_OPEN_FOR_INPUT 

您没有显示MQOPEN调用,但是如果它正在使用O_options ,则可以解释这一点,您目前有以下内容:

 O_options = MQOO_OUTPUT + MQOO_FAIL_IF_QUIESCING; 

这应该像下面这样:

 O_options = MQOO_INPUT_AS_Q_DEF + MQOO_FAIL_IF_QUIESCING; 

我建议您查看随IBM MQ安装提供的示例应用程序。 在Linux上,这些将位于/opt/mqm/samp 。 样本amqsget0.c与您的程序类似,只是它使用MQCONN而不是MQCONNX。