Chinaunix

标题: 求解 消息队列 结合 共享内存的问题 [打印本页]

作者: meimeihunan    时间: 2011-08-04 11:00
标题: 求解 消息队列 结合 共享内存的问题
本人系初学者,消息队列和 对共享内存这块不是很清楚。以前程序运行蛮正常,最近老是遇到了一个问题。在通过消息队列传送消息的时候,
msgsnd是成功的,但是msgrecv的时候,返回值=348.但是消息没法获取到里面的内容,不知道是什么原因?求高手解答,帮忙解释,msgrecv返回值
具体啥意思啊?部分代码见下:
发送消息时,返回的是0,消息发送应该是成功了。
return msgsnd(iMsgKeyID,(struct msgbuf *)(&strMsg),sizeof(strMsgType),iFlag);

采用下面语句接受消息时候,nRET=348.说是共享内存不够,但是调了共享内存也没见有效果。
int nRET = msgrcv(iMsgKeyID,(struct msgbuf *)(astrMsg),sizeof(strMsgType),alReceiver,iFlag);
作者: zghover    时间: 2011-08-05 12:49
切磋一下,代码贴上来吧!
作者: meimeihunan    时间: 2011-08-08 11:22
/*============================
        发送消息
==============================*/
int MsgSend(int                aiMsgKeyID,                /*消息队列的msgid,<=0表示要重启*/
                        long        alReceiver,                /*本消息的接收者*/
                        long        alSender,                /*发送者*/
                        int                aiCommand,                /*消息命令*/
                        const char        *aszMsg,        /*消息内容*/
                        int                aiFlagBlock)        /*0非阻塞,1阻塞*/
{
        strMsgType                strMsg;
        int                                iMsgKeyID = 0;
        int                                iFlag = 0;

        memset(&strMsg,0x0,sizeof(strMsgType));
        strMsg.iCommand = aiCommand;
        strMsg.lReceiver = alReceiver;
        strMsg.lSender = alSender;
        strncpy(strMsg.szMsg,aszMsg,MSGLEN);
        if (aiFlagBlock == 0)        iFlag =IPC_NOWAIT;
        else                iFlag = 0;

        if (aiMsgKeyID <= 0)                /*需要重新取得MSGID*/
                iMsgKeyID = msgget(MSGKEY,0666);
        else        iMsgKeyID = aiMsgKeyID;
        if (iMsgKeyID< 0)        return -1;
        return msgsnd(iMsgKeyID,(struct msgbuf *)(&strMsg),sizeof(strMsgType),iFlag);       
}


/*============================
        接收消息
==============================*/
int MsgRcv(int        aiMsgKeyID,                /*消息队列的msgid,<=0表示要重启*/
                        long        alReceiver,                /*入参,本消息的接收者*/
                        int                aiFlagBlock,        /*0非阻塞,1阻塞*/
                        strMsgType        *astrMsg)        /*出参,消息内容*/
{
        int                                iMsgKeyID = 0;
        int                                iFlag = 0;

        if (aiFlagBlock == 0)        iFlag =IPC_NOWAIT;
        else                iFlag = 0;

        if (aiMsgKeyID <= 0)                /*需要重新取得MSGID*/
                iMsgKeyID = msgget(MSGKEY,0666);
        else        iMsgKeyID = aiMsgKeyID;

        if (iMsgKeyID< 0)        return -1;
               
        int nret  =0;
        nret = msgrcv(iMsgKeyID,(struct msgbuf *)(astrMsg),sizeof(strMsgType),alReceiver,iFlag);
        LOGTRACE("iMsgKeyID=%d,nret======%d",iMsgKeyID,nret);
        if (nret<=0)
                return -1;

        return 1;
}


int pf_GetOpsInfo(int                aiMsgKeyID,                /*消息队列的msgid,<=0需要重取*/
                                  long                alServiceID,        /*SERVICE编号,<=0表示要重取*/
                                  double        adOps,                        /*临时表流水号*/
                                  double        adAcctID,
                                  strCliShmType *apCliShm)        /*出参,保存在共享内存中的信息*/
{
        long        lThisSrv,lSender;
        char        szMessage[MSGLEN + 1],szTemp[7];
        int                iSerial = 0,iCommand = 0;
        strMsgType        strMsg;
        strCliShmType *pTempCliShm;

        if (alServiceID <= 0)        lThisSrv = (long)getpid();
        else        lThisSrv = alServiceID;

        if (lThisSrv < MSGTYPESRV)                lThisSrv += MSGTYPESRV;
        sprintf(szMessage,"%12.0f%12.0f",adOps,adAcctID);
LOGTRACE("szMessage 1 = %s",szMessage);
    if(MsgSend(aiMsgKeyID,MSGTYPECTL,lThisSrv,CMDOPSINF,szMessage,1)<0)
                return -1;
LOGTRACE("szMessage 2 = %s",szMessage);
        if(MsgRcv(aiMsgKeyID,lThisSrv,1,&strMsg)<0)                return -1;
LOGTRACE("strMsg.szMsg 3 = %s",strMsg.szMsg);
        strcpy(szMessage,strMsg.szMsg);
        strncpy(szTemp,szMessage,6);
        szTemp[6]='\0';

        iSerial = atoi(szTemp);
        if (iSerial == -1 || atof(szMessage+6) == -1)
                return -1;

        memcpy(apCliShm,&(strMsg.strShm),sizeof(strCliShmType));
        return 0;
}
作者: meimeihunan    时间: 2011-08-08 11:27
从消息队列获取消息的时候(粗体字部分),返回值是正确的348。但是里面的内容没了,是-1。一直很奇怪,这是偶尔出现的现象,之前以为是共享内存设置小了,调到原来的10倍还是没反应.不知道消息队列的值啥时候会失效?还是消息队列 在什么地方设置了最大允许消息数量?
作者: txgc_wm    时间: 2011-08-08 21:19
把完整的程序贴出来看看嘛!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2