当前位置:  技术问答>linux和unix

消息队列收不到消息

    来源: 互联网  发布时间:2017-03-09

    本文导语:  我在程序启动的时候创建了两个线程和一个消息队列。一个线程把收到的数据发给另一个线程。 //我的数据封装 struct mymsgbuf {     long msg_type;//消息类型 int nCurSeqNo;//丢包计数器0 short *pData; int threadnumber; //线...

我在程序启动的时候创建了两个线程和一个消息队列。一个线程把收到的数据发给另一个线程。

//我的数据封装
struct mymsgbuf
{
    long msg_type;//消息类型
int nCurSeqNo;//丢包计数器0
short *pData;
int threadnumber; //线程数标号
};


实际调用:msg_create(g_MsgSqid); //创建消息队列

//创建消息队列
int CMessage::msg_create(int msgSqid )
{
 key_t key;
 key = IPC_PRIVATE;

 int gflags;//rflags;
 gflags=IPC_CREAT|IPC_EXCL; //IPC_EXCL如果队列已存在,则失败
 msgSqid = msgget(key,gflags|00666);//创建一个新的消息队列,返回消息队列标识符

  if(msgSqid == -1)
 {
  printf("msg create errorrn");
  return 1;
 }
  return msgSqid;//得到了队列标识符,我们就可以在队列上执行我们希望的操作
}
实际调用:sendMessage(g_MsgSqid,10,&m_recvmsgdata);//发送消息至处理线程

//发送消息
void CMessage::sendMessage(int msgSqid,long type,struct mymsgbuf *msg_sbuf)
{
  int sflags = IPC_NOWAIT;

  msg_sbuf->msg_type = type;

  int length = sizeof(mymsgbuf) - sizeof(long);

  int reval = msgsnd(msgSqid,&msg_sbuf,length,sflags);

   if(reval == -1)
    {
      printf("message send errorn");
    }
}
实际调用:recvMessage(g_MsgSqid,10,mymsgrbuf);//接收到数据存于mymsgrbuf
//接收
 void CMessage::recvMessage(int msgSqid,long type,struct mymsgbuf *msg_rbuf)
 {
   int rflags=IPC_NOWAIT|MSG_NOERROR;

   /*The length is essentially the size of the structure minus sizeof(mtype)*/
   int length = sizeof(struct mymsgbuf)-sizeof(long);
   int reval = msgrcv(msgSqid,msg_rbuf,length,type,rflags);//c从消息队列接收消息,type为将要从消息队列中读取的消
   if(reval == -1)//返回复制到消息缓冲区的字节数
   {
      printf("read msg errorn");       //接收不到数据!!!!!!!!!!!

       if(errno == ENOMSG)
     printf("8n");

   }

   else
   printf("read from msg queue %d bytesn",reval);
 }
现在的问题是接收不到数据,errno == ENOMSG。但我的数据类型没错啊。。。。

|

IPC_NOWAIT标志被设置,函数将会立刻返回,返回值是-1.
如果IPC_NOWAIT标志被清除,进程将会挂起以等待一条相应类型的消息到达。

|
非阻塞recv,你确定是你希望的?

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。














站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3