带有 MQ 的 C 程序获取消息 MQGET 结束,原因代码为 2005

标签 c ibm-mq

我制作并运行了 C 程序,它连接到 MQ 并尝试获取消息。我总是收到一条消息:

         MQGET ended with reason code 2005        

这意味着:

           MQRC_BUFFER_LENGTH_ERROR (2005, X'7D5') Buffer length parameter not valid    

我将缓冲区声明为

           char     TempBuf[65536];    

MQ中的消息是

            "This is a test message"    

在 MQ 错误日志中没有写入任何内容。

程序如下:

               **/* header files */**    
               #include <stdio.h>   
               #include <stdlib.h>      
               #include <string.h>      

               #include <cmqc.h>      /* includes for MQI*/              
               #include <cmqxc.h>   

               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;    
                /* use MQOPEN */    

                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;    

                }    
                 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 */**

缓冲区未打印,您可以在上面看到错误消息。 我感谢任何帮助。 谢谢

最佳答案

缓冲区的类型应该是 MQBYTE 而不是 char:

变化: char TempBuf[65536];
到: MQBYTE TempBuf[65536];

要获得缓冲区长度,您应该使用 sizeof 而不是 strlen

改变: buflen = strlen(TempBuf) - 1;
到: buflen = sizeof(TempBuf)-1;

关于带有 MQ 的 C 程序获取消息 MQGET 结束,原因代码为 2005,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44576287/

相关文章:

c - Linux 内核中的 asm__volatile()

java - 如何在java中设置IBM MQ GET预读MaximumSize

java - 从 Java 读取来自 MQ 的所有消息

C# IBM MQ 客户端发送我自己的 messageId

java - 使用 JMSTIMESTAMP 在 MQ QUEUE 中获取消息

c - 删除行时文本文件中的特殊字符

英尺和英寸到厘米的换算表

c - 为什么这个归并排序算法不起作用?

c - C 中的回文函数,不返回值

java - 尝试从 MQ 读取消息时始终收到空消息