首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用MQPUT分割C程序中的错误

用MQPUT分割C程序中的错误
EN

Stack Overflow用户
提问于 2017-06-28 23:33:48
回答 2查看 133关注 0票数 0

我有一个下面的程序

代码语言:javascript
复制
#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";)之后,我得到了错误

代码语言:javascript
复制
 Segmentation fault    

你能帮我调试一下这个程序吗?我必须为结构使用malloc吗?它是用C语言编写的,使用MQPUT

下面是一个程序,上面的函数被调用

代码语言:javascript
复制
#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);    
 }     
EN

回答 2

Stack Overflow用户

发布于 2017-06-29 02:03:35

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

谢谢

票数 0
EN

Stack Overflow用户

发布于 2017-06-29 07:03:37

这是一些糟糕的代码。

代码语言:javascript
复制
typedef struct tagDTE_QUEUE_DESCRIPTOR
{
    MQHOBJ handle;
    int    IsSyncpointControled;
} DTE_QUEUE_DESCRIPTOR, *PDTE_QUEUE_DESCRIPTOR;

static PDTE_QUEUE_DESCRIPTOR sQueues = NULL;

if(sQueues[qd].IsSyncpointControled)

在您发布的代码中,'sQueues‘从未设置,这就是为什么它在'if’语句上抛出分段错误的原因。如果'qd‘真的像你说的那样是'-1’,那么我想知道你到底在做什么。

代码语言:javascript
复制
dteretinit = dteMqInit(QMgrName,hostname,channelName);

为什么不将端口号传递给dteMqInit子例程?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44806933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档