c - 使用 MQPUT 的 C 程序中出现段错误

标签 c ibm-mq

我有一个程序如下

#include <stdio.h>    
#include <cmqc.h>    
#include <cmqxc.h>    
#include "dte_mq.h"    
#include <string.h>    
#include <stdlib.h>    

typedef struct tagDTE_QUEUE_DESCRIPTOR    
{    
    MQHOBJ handle;    
    int    IsSyncpointControled;    
} DTE_QUEUE_DESCRIPTOR, *PDTE_QUEUE_DESCRIPTOR;    
static MQHCONN sHConn = 0;    
static MQLONG  sCompCode = MQCC_OK;    
static MQLONG  sReason = MQRC_NONE;    
static int     sNumOpenQueues = 0;    
static PDTE_QUEUE_DESCRIPTOR sQueues = NULL;   
MQLONG   OpenCode;    
MQOD     od = {MQOD_DEFAULT};    /* Object Descriptor */    
MQMD     md = {MQMD_DEFAULT};    
MQPMO    pmo = {MQPMO_DEFAULT};    
MQLONG   O_options;    
MQLONG   C_options;     
MQGMO   gmo = {MQGMO_DEFAULT};    
/* MQCONNX options */    
MQCNO   Connect_options = {MQCNO_DEFAULT};    
/* Client connection channel */    
MQCD    ClientConn = {MQCD_CLIENT_CONN_DEFAULT};    

DTE_MQ_RESULT dteMqSend(int qd, void *buf, int len)    
{   
printf("oleg\n");    
/* memcpy(md.Format, MQFMT_STRING, MQ_FORMAT_LENGTH); */    
    md.MsgType  = MQMT_DATAGRAM;    
printf("oleg1\n");    
   memcpy(md.MsgId, MQMI_NONE, sizeof(md.MsgId));    
printf("oleg2\n");    
   memcpy(md.CorrelId, MQCI_NONE, sizeof(md.CorrelId));    
printf("oleg3\n");    
   memcpy(md.Format, MQFMT_STRING, (size_t)MQ_FORMAT_LENGTH);    
printf("oleg4\n");    

   if(sQueues[qd].IsSyncpointControled)    
      pmo.Options |= MQPMO_SYNCPOINT;    
printf("oleg5\n");    
   MQPUT(sHConn, sQueues[qd].handle, &md, &pmo, len, buf, &sCompCode, &sReason);    
   printf("MQput CC=%ld RC=%ld\n", sCompCode, sReason);    
   if (sCompCode != MQCC_OK) return DTE_MQR_FAILED;    

   return DTE_MQR_OK;    
}    

我输入了 print 语句,发现在 printf("oleg4\n";) 之后出现错误
段错误

你能帮我调试一下程序吗?我必须对结构使用 malloc 吗?它是用 C 编写并使用 MQPUT

下面是一个程序,其中调用了上面的函数

#include <stdio.h>    
#include <stdlib.h>    
#include <string.h>    

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


int main(int argc, char **argv)    
{    
    MQLONG   messlen;                /* message length received       */    

    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;    
    MQBYTE   TmpBuf[65536] = "This is a simple test message.";    
    int msgsToGet;    
    int msgsGot;    
    int dteretinit;    
    int dteretdeinit;    
    int dteretopen;    
    int dteretclose;    
    int qd;    
    int dteretput;    

    if (argc != 6)    
    {  
        printf("Usage: NewMQTest QMgrName ChlName hostname port  QName\n");    
        exit(-1);    
    }    


    strncpy(QMgrName, argv[1], MQ_Q_MGR_NAME_LENGTH);    
    QMgrName[MQ_Q_MGR_NAME_LENGTH] = '\0';    

    strncpy(channelName, argv[2], MQ_CHANNEL_NAME_LENGTH);    
    channelName[MQ_CHANNEL_NAME_LENGTH] = '\0';    

    strncpy(hostname, argv[3], 1023);    
    hostname[1023] = '\0';    

    strncpy(port,argv[4],4);    

    strncpy(QName, argv[5], MQ_Q_NAME_LENGTH);    
    QName[MQ_Q_NAME_LENGTH] = '\0';    

    dteretinit = dteMqInit(QMgrName,hostname,channelName);    
    printf("Return code from dteMqInit = %d\n",dteretinit);    
    qd = -1;    
    dteretopen = dteMqOpen(QName, qd);    
    printf ("Return code from dteMqOpen = %d\n",dteretopen);    

   if (dteretopen == 0 )    
   {    
       buflen = strlen(TmpBuf);    
       TmpBuf[buflen + 1] = '\0';    
       dteretput = dteMqSend(qd,*TmpBuf,buflen);    
       printf("return mqput %d\n",dteretput);    
   }    
   dteretclose = dteMqClose(qd);    
   printf("Return code from dteMqClose = %d\n",dteretclose);    

   dteretdeinit = dteMqDeinit();    
   printf("Return code from dteMqDeinit = %d\n",dteretdeinit);    
 }     

最佳答案

我分析了我的程序并检查了 MQ。 SSL 不允许我连接到 MQ,这就是我无法更改 qd 的原因。程序很老了,失败时返回值设置为0,1为成功。我从来没有这样做过。 0 总是成功。

谢谢

关于c - 使用 MQPUT 的 C 程序中出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44806933/

相关文章:

c - 我需要/可以在 C 中释放一个空指针吗?

java - 如何通过ActiveMQ服务器使用Websphere MQ Server,需要注意什么?

c#-4.0 - 来自 C#/.NET 的 MQ 统计监控

c++ - 安装 pHash 库时对 `fftw_init_threads' 的 undefined reference

c - 将 Double 转换为 Char 时的舍入错误

c - 跳台 - 组件 8086

c - 程序没有在 scanf ("%c", &ch) 行停止,为什么?

jms - 如何在多线程应用程序中每个连接使用多个 session ?

logging - 读取 WebSphere MQ Activity 日志文件

java - JMS事务如何与并发使用者一起工作?