当前位置: 技术问答>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。但我的数据类型没错啊。。。。
//我的数据封装
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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。