0
for (;;)
{
    if (msgrcv(msqid, &flag, sizeof(struct flags) - sizeof(long), 1, IPC_NOWAIT)>0)
           break;
}
    msgsnd(msqid, &message , sizeof(struct messages) - sizeof(long), 0);

Is there any accept() function like in sockets IPC, but for message queues IPC? My server should wait client connection and only when client connected send data back to it. I special send from client some useless data and check data in infinity loop(that means client is connected, I know that is very stupid algorithm).

4

1 回答 1

0

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

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

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

首先,做你正在做的事情,但不要在服务器的msgrcv. 如果您什么都不做,那么循环旋转毫无意义。只是阻塞,直到客户宣布自己。(并且使用不同的消息类型进行客户端到服务器和服务器到客户端的通信——你不希望客户端将它们的消息消费到服务器,反之亦然。)

其次,切换到 AF_UNIX 流套接字,这将为您提供可用的accept()语义。

于 2013-05-14T19:31:53.860 回答