免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3035 | 回复: 4
打印 上一主题 下一主题

求解 消息队列 结合 共享内存的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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);

论坛徽章:
0
2 [报告]
发表于 2011-08-05 12:49 |只看该作者
切磋一下,代码贴上来吧!

论坛徽章:
0
3 [报告]
发表于 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;
}

论坛徽章:
0
4 [报告]
发表于 2011-08-08 11:27 |只看该作者
从消息队列获取消息的时候(粗体字部分),返回值是正确的348。但是里面的内容没了,是-1。一直很奇怪,这是偶尔出现的现象,之前以为是共享内存设置小了,调到原来的10倍还是没反应.不知道消息队列的值啥时候会失效?还是消息队列 在什么地方设置了最大允许消息数量?

论坛徽章:
0
5 [报告]
发表于 2011-08-08 21:19 |只看该作者
把完整的程序贴出来看看嘛!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP