C++ UNIX消息队列中的accept()

C++ UNIX消息队列中的accept(),c++,c,linux,unix,ipc,C++,C,Linux,Unix,Ipc,是否有类似于socketsIPC的accept()函数,但用于消息队列IPC? 我的服务器应该等待客户端连接,并且只有在客户端连接时才将数据发送回服务器。 我专门从客户端发送一些无用的数据,并在无限循环中检查数据(这意味着客户端已连接,我知道这是非常愚蠢的算法)。不,没有直接类似的。消息队列更像是无连接的数据报套接字,而不是面向连接的流套接字(支持accept()等等) 一些实现(z/OS?)公开了在msgrcv上被阻止的进程数,这与您正在寻找的类似,但这是不可移植的 在我看来,你有两个简单的选

是否有类似于
sockets
IPC的
accept()
函数,但用于
消息队列
IPC? 我的服务器应该等待客户端连接,并且只有在客户端连接时才将数据发送回服务器。
我专门从客户端发送一些无用的数据,并在无限循环中检查数据(这意味着客户端已连接,我知道这是非常愚蠢的算法)。

不,没有直接类似的。消息队列更像是无连接的数据报套接字,而不是面向连接的流套接字(支持
accept()
等等)

一些实现(z/OS?)公开了在
msgrcv
上被阻止的进程数,这与您正在寻找的类似,但这是不可移植的

在我看来,你有两个简单的选择

首先,执行您正在执行的操作,但不要在服务器的
msgrcv
中使用IPC\u NOWAIT。如果你什么都不做,在一个循环中旋转没有意义。只要封锁,直到客户宣布自己。(并使用不同的消息类型进行客户端到服务器和服务器到客户端的通信-您不希望客户端将消息传递到服务器,反之亦然。)

其次,切换到AF_UNIX stream sockets,这将为您提供
accept()
able语义。

-阅读本网络教程以了解网络基础知识。
for (;;)
{
    if (msgrcv(msqid, &flag, sizeof(struct flags) - sizeof(long), 1, IPC_NOWAIT)>0)
           break;
}
    msgsnd(msqid, &message , sizeof(struct messages) - sizeof(long), 0);