簡體   English   中英

使用MQPUT的C程序中的分段錯誤錯誤

[英]Segmentation fault error in C program using MQPUT

我下面有一個程序

#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總是成功。

謝謝

這是一些錯誤的代碼。

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”,那么我必須懷疑您在做什么。

dteretinit = dteMqInit(QMgrName,hostname,channelName);

您怎么不將端口號傳遞到dteMqInit子例程中?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM